当前位置:首页 > 分类 > JAVA基础 > JDK源码-HashSet源码分析

JDK源码-HashSet源码分析

HashSet用HashMap实现,实例化一个HashSet对象就是实例化一个HashMap对象,向HashSet-add(A)一个元素就是向HashMap-put(A,static final obj),所以要了解HashSet应先了解HashMap

1,HashSet类定义如下

public class HashSet<E>
   extends AbstractSet<E>
   implements Set<E>, Cloneable, java.io.Serializable
{
   static final long serialVersionUID = -5024744406713321676L;

   private transient HashMap<E,Object> map;

   // Dummy value to associate with an Object in the backing Map
   private static final Object PRESENT = new Object();

   /**
    * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
    * default initial capacity (16) and load factor (0.75).
    */
   public HashSet() {
       map = new HashMap<>();
   }

A,一个HashMap类型的成员变量map;

B,一个静态常量Object PRESENT;

C,默认构造器初始化map;


2,add方法

    public boolean add(E e) {
       return map.put(e, PRESENT)==null;
   }

可见新增的元素保存在map中,同时map的value是上面定义的静态常量PRESENT,是不是可以理解为就是new个hashmap来存key,value都是一样的没有实际意义的PRESENT。

由于使用hashmap来存储元素,而hashmap本身就是无序的,所以hashset也是无序的。

当不需要保证插入顺序的时候,使用hashset来操作数据性能优于ArrayListLinkedList