从源码分析HashSet集合

x33g5p2x  于2021-12-06 转载在 其他  
字(2.7k)|赞(0)|评价(0)|浏览(275)

简介

HashSet在java集合体系中的继承实现关系。

HashSet实现Set接口,由哈希表(实际为HashMap实例)支持。

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable

HashSet继承至AbstractSet,并且实现了Set,Cloneable以及java.io.Serializable接口,所以它支持可复制以及序列化操作。

底层以哈希表为支持(HashMap为实例)。

private transient HashMap<E,Object> map;

构造函数

HashSet提供了四种HashSet的构造方式

HashSet()

构造一个新的空集合; HashMap实例具有默认初始容量(16)和负载因子(0.75)。

public HashSet() {
       map = new HashMap<>();
   }

HashSet(Collection<? extends E> c)

构造一个包含指定集合中的元素的新集合。

public HashSet(Collection<? extends E> c) {
       map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
       addAll(c);
   }

HashSet(int initialCapacity, float loadFactor)

构造一个新的空集合; HashMap实例具有指定的初始容量和默认负载因子(0.75)。

public HashSet(int initialCapacity, float loadFactor) {
       map = new HashMap<>(initialCapacity, loadFactor);
   }

HashSet(int initialCapacity)

构造一个新的空集合; HashMap实例具有指定的初始容量和指定的负载因子。

public HashSet() {
   public HashSet(int initialCapacity) {
       map = new HashMap<>(initialCapacity);
   }

常用方法

Iterator iterator()

返回此集合中元素的迭代器。 元素没有特定的顺序返回。

public Iterator<E> iterator() {
        return map.keySet().iterator();
    }

int size()

返回此集合中的元素数。

public int size() {
        return map.size();
    }

boolean isEmpty()

如果此集合不包含元素,则返回 true 。

public boolean isEmpty() {
        return map.isEmpty();
    }

boolean contains(Object o)

如果此集合包含指定的元素,则返回true 。

public boolean contains(Object o) {
        return map.containsKey(o);
    }

boolean add(E e)

将指定的元素添加到此集合(如果尚未存在)。

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

boolean remove(Object o)

如果存在,则从该集合中删除指定的元素。

public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }

void clear()

清空集合中的元素

public void clear() {
        map.clear();
    }

Object clone()

返回此 HashSet实例的浅层副本:元素本身不被克隆。

public Object clone() {
        try {
            HashSet<E> newSet = (HashSet<E>) super.clone();
            newSet.map = (HashMap<E, Object>) map.clone();
            return newSet;
        } catch (CloneNotSupportedException e) {
            throw new InternalError(e);
        }
    }

可以看到HashSet中的方法都是在HashMap的基础上进行操作的。

LinkedHashSet

LinkedHashSet是HashSet的一个子类,它使用一个双向链表维护集合,使得LinkedHashSet具有有序性(插入元素的顺序)。

public class LinkedHashSet<E>
    extends HashSet<E>
    implements Set<E>, Cloneable, java.io.Serializable

LinkedHashSet继承至HashSet,并且实现了Set, Cloneable, java.io.Serializable接口,具有Set集合不重复的特点和可复制、可序列化的性质。

构造方法
LinkedHashSet中提供了四种构造方法:

  • LinkedHashSet(int initialCapacity, float loadFactor)
    构造具有指定的初始容量和负载因子的新的,空的LinkedHashSet。
public LinkedHashSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor, true);
    }
  • LinkedHashSet(int initialCapacity)
    构造一个具有指定初始容量和默认负载因子(0.75)的新的,空的LinkedHashSet。
public LinkedHashSet(int initialCapacity) {
        super(initialCapacity, .75f, true);
    }
  • LinkedHashSet()
    构造一个具有默认初始容量(16)和负载因子(0.75)的新的,空的LinkedHashSet。
public LinkedHashSet() {
        super(16, .75f, true);
    }
  • LinkedHashSet(Collection<? extends E> c)
    构造与指定集合相同的元素的新的LinkedHashSet。
public LinkedHashSet(Collection<? extends E> c) {
        super(Math.max(2*c.size(), 11), .75f, true);
        addAll(c);
    }

相关文章