==和eauals的区别

一直对==和equals方法判断相等很模糊。今天又仔细看了下。留个纪念


网上一直有人说

[quote]==比较的是内存地址;
equals比较的是内容。[/quote]


这种说法是不严谨的。
首先我们看下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方法的区别。你就不会迷糊了吧。

你可能感兴趣的:(java)