一直对==和equals方法判断相等很模糊。今天又仔细看了下。留个纪念
网上一直有人说
引用
==比较的是内存地址;
equals比较的是内容。
这种说法是不严谨的。
首先我们看下java中object中的源码。因为所以的类都继承了object这个类。那么方法也是了
object.java中的eauqls方法如下:
public boolean equals(Object obj) {
return (this == obj);
}
看完代码发现。在object类中。equals和==是没有任何区别的。都比较的是内存地址。也就是说。都是比较两个引用是否指向同一个对象。是则返回true。否则返回false
那为什么很多人说比较对象呢。因为很多都虽然继承了object类。但是它们很多都重写了equals方法
最典型的就是string类
看string类中的equals方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
根据引用取出内容。然后逐个比较。相同返回true。否则false
现在明白了。原来根据类的不同equals方法比较的东西也不尽相同。
再看list的抽象类AbstractList
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof List))
return false;
ListIterator e1 = listIterator();
ListIterator e2 = ((List) o).listIterator();
while(e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();
Object o2 = e2.next();
if (!(o1==null ? o2==null : o1.equals(o2)))
return false;
}
return !(e1.hasNext() || e2.hasNext());
}
同样重写了equals方法。然后迭代判断两个list是否相同。
所以再有人问你==和equals方法的区别。你就不会迷糊了吧。