美文网首页
java中“==”和equals和hashCode的区别

java中“==”和equals和hashCode的区别

作者: 芒鞋胜马 | 来源:发表于2018-03-12 20:37 被阅读0次

1) "==" 比较两个变量的值 (变量对应内存中存储数值) 是否相等
例如 两个基本类型的数据 或者 两个引用变量是否相等。
==比较的就是变量的值,基本数据类型,变量直接存值,引用数据类型,变量存的是地址的值,比较的都是变量直接存储的值
2)
equals() 是 object类方法 equals(Object)与“==”运算符一样,比较的是引用

String s1 = new String("string");

 String s2 = new String("string");

其中s1,与s2是两个不同的对象,首地址不同, s1 == s2 返回false

而内容相同 所以 s1.equals(s2); 返回true。

equals 的 源码:
public boolean equals(Object obj) {
return (this == obj);
}

当我们想比较某个对象,例如学生 就可以可以重写equals,从学号,姓名等具体的方面 比较

重写equals() 方法需要注意:

自反性 ,对称性,传递性,一致性,和非null。

3) hashCode()方法是从Object类中继承过来的,它也用来鉴定两个对象是否相等。

hashCode()这个方法主要是为了更好支持哈希表(HashMap、HashSet、HashTable等)

哈希表的存储原理:
当我们向哈希表插入一个object时,首先调用hashCode()方法获得该对象的哈希码,通过该哈希码直接定位object在哈希表中的 位置。如果该位置没有对象,将object插入该位置,如果该位置有对象(可能有多个,通过链表实现),则调用equals()方法将这些对象与object比较,如果相等,则不需要保存object,否则,将该对象插入到该链表中。

所以 equals()相等,则hashCode()必须相等。

重写equals() 方法之后,必须重写HashCode()方法。

重写HashCode注意:
如果重写equals(),两个对象equals()方法判断相等,则对应的HashCode也是相等的 如果不等 ,则需要重写HashCode方法。
hashCode 不能简单到容易造成Hash冲突
HashCode不能太复杂,以至于影响性能。

相关文章

网友评论

      本文标题:java中“==”和equals和hashCode的区别

      本文链接:https://www.haomeiwen.com/subject/gchkfftx.html