创建Set集合底层创建了一个Map集合的深入理解:
- 我们创建一个Set集合具体实现类在底层其实就是创建了一个具体的Map集合的实现类对象
- 也就是我们的Set底层其实是通过Map进行存储的
- 比如我们的HashSet底层其实就是创建了一个HashMap,也就是我们的HashSet其实就是通过HashMap进行存储的
- 也就是我们的Set底层其实是通过Map进行存储的
那么我们的HashSet是属于单列集合的一种,但是这个时候我们如果是使用了HashMap进行存储的,而这里的HashMap是"双列集合"的一种,这个时候我们的HashSet在HashMap中究竟是如何进行存储的?
首先我们要知道:
- HashSet是存储单列数据,也就是一个一个的数据
- 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?
- 为了防止出现空指针异常
- 我们的Hashtable中无法存放为null的数据