目录
写这篇文章是为了整理一下最近遇到的问题:
hashcode()
1.定义:
可以简单理解为传入不同的成员变量,返回一个哈希值(也可以成为散列码),通过散列的方式可以快速找到一个对象的具体位置.
主要用在对象的哈希处理和数据结构如哈希表(HashMap、HashSet等)中。`hashCode()` 方法是Object类的一个成员,它返回一个整数值,这个值代表了对象的哈希码,也称为散列码或指纹。这个哈希码通常用于快速查找和区分对象,因为不同的对象通常会有不同的哈希码。
2.定位:
hashcode()是在Object.toString()里会用到的方法
当打印对象名的时候会自动调用Object.toString()方法,代码我给大家看一下:
class Person{
String name;
int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
}
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Person p = new Person("张三", 20);
System.out.println(p);
System.out.println(p.toString());
}
}
运行结果是这样的。
之所以会打印出以上内容,因为Object.toString()方法的源代码是这样的:
3.代码:
hashCode的源代码长这个样子,它是一个本地代码,用C++写的,怎么样很抽象对吧。
4.思考
既然:hashcode()可以简单理解为传入不同的成员变量,返回一个哈希值(也可以成为散列码),通过散列的方式可以快速找到一个对象的具体位置.
那么我们是否可以认为两个年龄相同,姓名不同的对象将存储在同一个位置?
class Person{
String name;
int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
}
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Person p1 = new Person("张三", 20);
Person p2 = new Person("张三", 20);
System.out.println(p1.toString().hashCode());
System.out.println(p2.toString().hashCode());
}
}
运行结果如下:
注意!两个对象的hash值都不一样!
经过问百度发现原因是:
hashCode
和hash
方法的区别主要在于它们的计算依据不同。
hashCode
是基于整个对象的,而hash
方法是基于传入的参数的。
就算这两个对象里面的成员变量都是相同的,但是这两个对象地址是不同的,占有不同的内存空间,因此他俩的hashCode()的返回值并不相同
-
hashCode()
:是对象的方法,返回对象的哈希码。默认情况下,基于对象的内存地址计算。如果重写了hashCode()
方法,可以基于对象的内容(如成员变量)计算。 -
Objects.hash()
:是Objects
类中的静态方法,用于根据一组参数计算哈希值。通常用于在重写hashCode()
方法时,根据对象的成员变量计算哈希值。
2.Objects.hash()
5.解决办法
hashcode()源代码里面有写解决办法,就是像重写equals方法一样可以重写hashcode()。
为了让不同的对象所产生的hashCode值相同,我们需要重写hashCode方法。
用这种方法可以确定不同对象里面的成员变量是否相同。
重写后的需要用到hash方法,因为hash方法的参数并没有对象的地址,只有成员变量。
重写代码如下:
import java.util.Objects;
class Person{
String name;
int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
public int hashCode(){
return Objects.hash(name, age);
}
}
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Person p1 = new Person("张三", 20);
Person p2 = new Person("张三", 20);
System.out.println(p1.toString().hashCode());
System.out.println(p2.toString().hashCode());
}
}
运行后截图:
综上,如果大家有不同的地方可以发评论区,我弄懂了一定解答。