[Java] Set集合底层实现原理

创建Set集合底层创建了一个Map集合的深入理解:

  • 我们创建一个Set集合具体实现类在底层其实就是创建了一个具体的Map集合的实现类对象
    • 也就是我们的Set底层其实是通过Map进行存储的
      • 比如我们的HashSet底层其实就是创建了一个HashMap,也就是我们的HashSet其实就是通过HashMap进行存储的

那么我们的HashSet是属于单列集合的一种,但是这个时候我们如果是使用了HashMap进行存储的,而这里的HashMap是"双列集合"的一种,这个时候我们的HashSet在HashMap中究竟是如何进行存储的?

首先我们要知道:

  1. HashSet是存储单列数据,也就是一个一个的数据
  2. HashMap是存储双列数据,也就是一个键值对一个键值对进行存储(键值对: key — value)
  • 其实HashSet中添加元素其实是添加到了HashMap中的key中了

HashSet中的add()方法的底层源码:

public boolean add(E e){
    /*
    这里我们可以发现我们使用HashSet中的add()方法其实在底层是使用了HashMap中的put()方法,这个时候将我们add()方法的参数作为put()方法的key进行存储的,而我们的value其实就是一个常量,这个常量 PRESENT 其实就是 private static final Object RESENT = new Object();
    */
    return map.put(e,PRESENT) == null;
}
  • 从这个源码中我们可以发现HashSet中存储的数据底层是通过使用HashMap进行存储的,并且我们的存放到了HashMap中的key中,HashMap中的value都是存储的一样的,都是同一个Object对象(底层源码中:PRESENT),
    private static final Object RESENT = new Object();
    • 也就是所有的key都指向了同一个value

为什么HashSet底层使用同一个Object对象来作为HashMap中的value?

  1. 为了防止出现空指针异常
  2. 我们的Hashtable中无法存放为null的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值