Set的源码分析
Posted duoduotouhenying
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Set的源码分析相关的知识,希望对你有一定的参考价值。
Set的内部实现其实是一个Map。即HashSet的内部实现是一个HashMap,TreeSet的内部实现是一个TreeMap,LinkedHashSet的内部实现是一个LinkedHashMap。
public HashSet() { map = new HashMap<>(); }
HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); }
public TreeSet() {
this(new TreeMap<E,Object>()); }
public LinkedHashSet() { super(16, .75f, true); }
但是,存到Set中只有一个元素,又是怎么变成(key,value)的呢?
以HashSet为例
private static final Object PRESENT = new Object(); public boolean add(E e) { return map.put(e, PRESENT)==null; } public Iterator<E> iterator() { return map.keySet().iterator(); }
原来是,把添加到Set中的元素作为内部实现map的key,然后用一个常量对象PRESENT对象,作为value。
这是因为Set的元素不可重复和Map的key不可重复有相同特点。Map有一个方法keySet()可以返回所有key。
public HashSet() {
map = new HashMap<>();
}
HashSet(intinitialCapacity, floatloadFactor, booleandummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
以上是关于Set的源码分析的主要内容,如果未能解决你的问题,请参考以下文章
Android 事件分发事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )(代码片段
boost:asio信号量signal_set源码分析及使用
boost:asio信号量signal_set源码分析及使用
mysql jdbc源码分析片段 和 Tomcat's JDBC Pool
Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段