HashSet存储原理

 HashSet: 底层哈希表结构(数组+链表+红黑树),由哈希表保证元素唯一,底层是HashMap实现
 哈希表的原理: 哈希表底层是数组+链表+红黑树,依赖于hashCode和equals方法
     数组存储元素哈希值, 哈希值相同的存储在链表中,链表节点超过8个,链表换成红黑树,因为红黑树效率高
     1.调用元素的hashCode()方法,便利数组,有没有这个哈希值,没有就直接存储
     2.数组中已经有哈希值相同的,那么就调用元素的equals()方法,和哈希值相同的元素进行一一比较
     3.equals()方法比较,有相等的就不存储,没有就存储
        //Student类中只重写了HashCode()方法,equals和toString都没有重写

        HashSet<Student> set = new HashSet<>();
        Student s1 = new Student("aaa", 18);
        set.add(s1);
        Student s2=new Student("aaa", 18);
        set.add(s2);
        System.out.println("s1:"+s1);//s1:day3.Student@2d93b2

        System.out.println("s2:"+s2);//s2:day3.Student@2d93b2

        System.out.println(s1==s2);//false

        System.out.println(s1.equals(s2));//false
  •  s1和s2的哈希值是一样的,因为重写了HashCode方法
  • s1和s2的打印结果为什么是一样的?难道地址值一样?明明是两个对象,   这是因为打印操作调用的是Object类中的toString方法,该方法的返回值是 包名.类名@哈希值的16进制  ,  哈希值一样打印的结果当然一样
  • 也就是说,打印的对象值,在这里不是对象的真是地址值,所以s1.equals(s2) 和s1==s2返回的都是false,因为他们真是地址不一样.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值