深入理解hashCode

概述:

此处可参考百度百科
在这里插入图片描述

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()判断当前的键是否与表中存在的键相同。

猜你喜欢

转载自blog.csdn.net/weixin_46011971/article/details/108357117
今日推荐