我读到.equals()比较对象的值,而==比较引用(即 - 变量指向的内存位置)。见这里:What is the difference between == vs equals() in Java?
但请注意以下代码:
package main;
public class Playground {
public static void main(String[] args) {
Vertex v1 = new Vertex(1);
Vertex v2 = new Vertex(1);
if(v1==v2){
System.out.println("1");
}
if(v1.equals(v2)){
System.out.println("2");
}
}
}
class Vertex{
public int id;
public Vertex(int id){
this.id = id;
}
}
输出:
(没有)
不应该打印2?
答案 0 :(得分:6)
您需要为.equals()
类实现自己的Vertex
方法。
默认情况下,您使用的是Object.equals
方法。 From the docs, this is what it does:
类Object的equals方法实现最具辨别力 对象可能的等价关系;也就是说,对于任何非null 引用值x和y,当且仅当x时,此方法返回true 和y引用相同的对象(x == y的值为true)。
您可以这样做:
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj.getClass() != getClass()) return false;
Vertex other = (Vertex)obj;
return (this.id == other.id);
}
答案 1 :(得分:3)
您需要覆盖equals()
的默认实现。默认实现是Object#equals()
:
public boolean equals(Object obj) {
return (this == obj);
}
被覆盖的版本将是这样的:
@Override
public boolean equals(Object obj)
{
if(obj == this) return true;
if(obj == null) return false;
if(obj.getClass() != getClass()) return false;
return ((Vertex) obj).id == this.id;
}