概述:
此处可参考百度百科
hashCode()方法的作用
1.返回对象的哈希代码值(就是散列码),用来支持哈希表,例如:hashMap,hashSet等等。
2.可以提高哈希表的性能
3.先看下Object源码的hashCode方法
源码注释比较长,可以大概总结为:
1.像Hash开头的类,HashMap、HashSet、Hash等等,哈希值代码值可以提高性能。
2.实现了hashCode一定要实现equals,因为HashMap底层就是通过这2个方法判断重复对象的。
hashCode与equals
1.如果两对象equals()是true,那么它们的hashCode()值一定相等。
2.如果两对象的hashCode()值相等,他们的equals不一定相等(hash冲突)
代码案例
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(age, name);
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
main运行
注释很清楚了,HashSet去重是怎么判断的
public class Test01 {
public static void main(String[] args) {
Person p1=new Person("wang",100);
Person p2=new Person("wang",100);
Person p3=new Person("java",200);
Person p4=new Person("WANG",100);
/**
* HashSet底层去重就是通过对象的eqauls和hashcode来判断去重的
* 准确说是HashMap的key去重
*/
HashSet<Person> set = new HashSet<>();
set.add(p1);
set.add(p2);
set.add(p3);
set.add(p4);
System.out.println("如果两对象equals()是true,那么它们的hashCode()值一定相等");
System.out.println("p1.equals(p2): "+p1.equals(p2));
System.out.println("==========");
System.out.print("(hashCode值)p1==p2:");
System.out.print(p1.hashCode()==p2.hashCode());
System.out.println("如果两对象的hashCode()值相等,他们的equals不一定相等(hash冲突)");
System.out.println("p1.equals(p4):"+p1.equals(p4));
System.out.print("(hashCode值)p1==p4:");
System.out.print(p1.hashCode()==p4.hashCode());
}
运行结果:
1.如果缺少hashCode或equals方法,输出结果不会去重。
2.HashSet是不允许有重复元素的。
3.HashSet存入数据,底层源码可不是一个个遍历去判断重复元素,是通过hash值去判断的。
HashSet源码
进入到HashMap里面去了
通过对象的hashCode()方法计算出哈希值
总结:
1.hashCode()在散列表中才有用,在其他情况下没用。
2.哈希值冲突场景,hashCode相等,但equals不一定相等。
3.hashCode:计算键的hashCode作为存储信息的数组下标用于查找键值对象的存储位置
4.equals:HashMap使用equals()判断当前的键是否与表中存在的键相同。