`
wxq594808632
  • 浏览: 262553 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

==和eauals的区别

    博客分类:
  • java
阅读更多
一直对==和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方法的区别。你就不会迷糊了吧。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics