详细版 hashcode() equals()
hashcode的作用是为了获取哈希码,实际上返回的是一个int类型的数,用于确定该对象在哈希表中所处的索引下标。hashcode是object对象的方法
散列表存储的是键值对(key-value)形式,可以通过key快速找出对应的value
整体流程(为什么需要HashCode()方法):
当一个对象加入hashset时,对先计算对象的哈希值来获取需要加入的位置,同时会判断该位置上是否存在其他的对象,如果存在会调用equals方法进行判断对象是否相等,如果相等则不会进行存储,如果不相等会散列到其他的位置。大大减少进行equals的次数。
重写equals为什么要重写hashcode
-
hashCode设计之初就是为了给hashmap这样的hash表使用,注重的是速度和效率,是为了减少进行equals的次数,减少系统的消耗
-
hashcode是用来获取对象的哈希值,所以并不需要唯一性,但equals必须严格地判断两个对象是否相同
-
如果两个对象完全相等,说明hashcode一定相等,则equals也一定相等
- equals相等,hashcode一定相等。
- equals不等,hashcode不一定不等。
- hashcode不等,equals一定不等。
- hashcode相等,equals不一定相等。
为了满足以上条件,所以重写equals必须重写hashcode
推荐博客[(76条消息) 彻底搞懂为什么重写equals还要重写hashcode?_初心JAVA的博客-CSDN博客_为什么重写equals还要重写hashcode]
补充下:==和equals的区别
== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
情况 1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
情况 2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
简约概括:==比较的是引用,equals比较的是内容
再补充以上:
- ==对比的是栈中的值,基本数据类型是变量值,引用类型是堆中内存对象的地址
- equals: object中默认也是采用==比较,通常会重写(为了不去对比对象的地址)
public boolean equals (object obj) [
return (this == obj);
}
string 已经重写了equals,比较的是值
例题:
public cass stringDemo {
public static void main(string args[]) [string str1 = "He11o";
string str2 = new string("He11o");
string str3 = str2; // 引用传递
System.out.printIn(strl == str2); // false
System.out.println(strl == str3); // false
System.out .printIn(str2 == str3); // true
System.out.print1n(strl.equals(str2)); // true
System.out.printIn(str1.equals(str3)); // true
System.out.print1n(str2.equa1s(str3)); // true
}
}
再补充:
1. String 中的 equals 方法是被重写过的,因为 object 的 equals 方法是比较的对象的内存地址,而String 的 equals 方法比较的是对象的值。
2. 当创建 String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个
String 对象。