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不能太复杂,以至于影响性能。