标签:his 堆内存 ++ eof 完成 false 高效 地方 highlight
== 和 equals()
记住三句话
1. 语义上:==指的是内存引用一样。equals是指的是逻辑相等。逻辑相等具体的意思由编写者决定。
2. 默认情况下(继承自Object类),equals和==是一样的,除非被覆写(override)了。public boolean equals(Object obj) { return (this == obj); }
3. 最典型equals已经被override的例子是String; String中的字符串文本相等则视为逻辑相等(s1.equals(s2)==true)。
String#equals:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
equals()
在初学Java的时候,很多人会说在比较对象的时候,==是比较地址,equals()是比较对象的内容,谁说的?
看看equals()方法在Object类中的定义:
这是比较内容么?明显是比较指针(地址)么...
但是为什么会有equals是比较内容的这种说法呢?
这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
因为在String中是进行内容的比较。
hashCode()
在Object类中的定义为:
是一个本地方法,返回的对象的地址值。
但是,同样的思路,在String等封装类中对此方法进行了重写。方法调用得到一个计算公式得到的 int值
3.两者的关系
①两个obj,如果equals()相等,hashCode()一定相等
②两个obj,如果hashCode()相等,equals()不一定相等
原因:从散列的角度考虑,不同的对象计算哈希码的时候,可能引起冲突,大家一定还记得数据结构中冲突的解决方案吧
但是要这么设计,用两个函数,个人的理解是为了比较两个对象时更高效。
可以考虑在Java集合中,判断两个对象是否相等的规则是:
第一步,如果hashCode()相等,则查看第二步,否则不相等;
第二步,查看equals()是否相等,如果相等,则两obj相等,否则还是不相等。
为什么这样做?个人的理解是让适当的函数完成适当的功能,毕竟hashCode()比equals()在某种程度上来得快。
(个人心得,若有错误,请指正)
Java中 == 和 equals()、 equals() 和 hashCode()
标签:his 堆内存 ++ eof 完成 false 高效 地方 highlight
原文地址:http://www.cnblogs.com/chengdabelief/p/7420549.html