当前位置 : 主页 > 网络编程 > 其它编程 >

常用集合之HashSet源码浅析

来源:互联网 收集:自由互联 发布时间:2023-07-02
类图源码构造方法publicclassHashSetextendsAbstractSetimplementsSet,Cloneable,java.io.Ser 类图 源码 构造方法 public class HashSetextends AbstractSetimplements Set, Cloneable, java.io.Serializable{//存储数据的对象由此就可
类图源码构造方法publicclassHashSetextendsAbstractSetimplementsSet,Cloneable,java.io.Ser

类图

源码

构造方法

public class HashSetextends AbstractSetimplements Set, Cloneable, java.io.Serializable{//存储数据的对象由此就可以看书HashSet是HashMap来实现的private transient HashMap map;//是所有写入 map 的 value 值。private static final Object PRESENT new Object();public HashSet() {map new HashMap();}public HashSet(int initialCapacity, float loadFactor) {map new HashMap(initialCapacity, loadFactor);}public HashSet(int initialCapacity) {map new HashMap(initialCapacity);}public Iterator iterator() {return map.keySet().iterator();}public int size() {return map.size();}//PRESENT是所有写入 map 的 value 值。public boolean add(E e) {return map.put(e, PRESENT)null;}public boolean remove(Object o) {return map.remove(o)PRESENT;}//...}

偷偷告诉你HashSet中没有 get 方法。

比较关键的就是这个add()方法。 可以看出它是将存放的对象当做了 HashMap 的健value都是相同的 PRESENT 。由于 HashMap 的 key 是不能重复的所以每当有重复的值写入到HashSet时value会被覆盖但 key不会受到影响这样就保证了HashSet中只能存放不重复的元素。

这里又要多问一句了为什么HashMap的键值是不重复的呢因为在HashMap的源码中是使用key的hashCode和key值去 取值的hashCode总不能重复吧。这就有源有头了

public V get(Object key) {Node e;return (e getNode(hash(key), key)) null ? null : e.value;}static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hashCode()) ^ (h >>> 16);}

ps: 文末推荐其他几篇有关集合的文章

  • 常用集合之ArrayList和Vector的区别源码浅析

  • 常用集合之LinkedList源码浅析

  • 常用集合之HashMap源码浅析

  • 常用集合之HashSet源码浅析

  • 常用集合之LinkedHashMap源码浅析

上一篇:JAVA中的多线程(五)
下一篇:没有了
网友评论