java 集合10 HashSet()存储自定义对象

HashSet() Set 的实现类,内部是哈希结构,保证元素的惟一性的方式依赖于:hashCode()【计算存储位置】equals()【解决哈希冲突】
无序的原因:计算出哈希值后存储的位置和添加进去的顺序很有可能是不一致的。
当元素存储到,HashCode() 中时,第一步都是先计算出元素对应的哈希值。而在上述的例子中,存储自定义的学生对象时,无法体现元素唯一行是因为,在堆中的每new 一个 对象,都有一个存储位置,都有一个独一无二的哈希值

需求
在上述的情境下,仍然想要按照同姓名同年龄来保证学生对象的惟一性
解决办法:不使用Object 中的hashCode() 方法,自己重写hashCode () 方法
代码:

  //HashSetDemo_Set   重写hashCode()  方法依赖于类的成员变量//依赖于姓名和年龄
    public int hashCode() {
        return name.hashCode()+age;
    }
 set.add(new Student("Lisi",20));
        set.add(new Student("Zhangshan",25));
        set.add(new Student("Lisi",20));
        set.add(new Student("Wangwu",18));

运行结果:[Lisi 20, Wangwu 18, Zhangshan 25]

思考过程
关于重写 hashCode () 方法,如果只是单纯的返回一个值,使所有的元素的哈希值都一样,那么都会执行equals() 方法,效率变得很低。所以将哈希值与类的成员变量相结合,尽量使不一样的元素的哈希值不一样。在写hashCode 函数时,一样的元素计算出的哈希值一定是一样的,再调用equals() , 不一样的元素的哈希值有可能会偶然的一样,但是也会调用equals() 最终会保证元素的一致性,同时保证效率。

Java可以自己为我们写 equals 和hashCode 函数
操待查找

猜你喜欢

转载自blog.csdn.net/Stitch__/article/details/82390130
今日推荐