【面试题】Java HashSet

HashSet底层存储

前提:
HashSet在存储数据时的规则 :会比较hash值(散列值),如果相同会调用equals比较内容

  1. 无序性:不等于随机性—>不等于添加的顺序

  2.                存储的数据在底层数组中并非数组索引添加
    
  3.                而是根据数据的hash值决定的
    
  4. 不可重复性:保证添加的元素按照equals方法判断时 不能返回true 相同元素只能添加一个

  5. 二、添加元素的过程 HashSet说明

  6. 1.根据元素的hash来决定存储位置 如果要存储的位置没有元素则直接添加进去

  7. 2.如果有元素 2.1 判断两者hash值是否一样 不一样则添加成功 --> 采用链表存储

  8.        2.2 如果两者hash值一样 会调用equals方法进行比较 如果内容也一样则添加失败
    
  9.            如果内容不一样 添加成功 七上八下
    
    1. 注意: 如果hash值不一样 内容一定不一样不需要对比每个元素
  10. 如果hash值一样 里面内容可能一样或不一样 所以在调用equals
    
    1. JDK7 元素a放在数组,指向原来元素
  11. JDK8 原来元素放在数组,指向元素a

    1. HashSet底层:数组 + 链表
      */

在这里插入图片描述

  1. 修改p1的name属性导致p1hash值发生改变,但是元素位置不变
  2. remove删除时,判断的是1001,"CC“的hash值,没有删除
  3. 添加1001,“CC”,当前位置是空的,添加成功
  4. 添加1001,“AA”,发现hash值对应的位置有元素(因为原位置并没发生变化),调用equals比较内容,发现不一致,链表存储,存在后面。

也可以看后图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值