Skip to content

Latest commit

 

History

History
56 lines (35 loc) · 1.97 KB

Java集合-Set.md

File metadata and controls

56 lines (35 loc) · 1.97 KB

Java集合 - Set

Set接口

Set中不包含相同元素。其中“相同”是通过equals()进行判断的。

HashSet

HashSet内部持有一个HashMap对象,对数据进行的操作(add(E):booleanremove(Object):booleansize():int)都是对内部的HashMap进行操作。所以,HashSet本质上相当于一个HashMap

LinkedHashSet

继承于HashSet

只是实现了几个构造方法,并且这几个构造方法都是直接使用了父类的构造方法。

LinkedHashSet所使用的父类构造方法:

HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

HashSet其他的构造方法:

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

只有在HashSet的这个构造方法中,把map实例化LinkedHashMap,而其他的构造方法则是把map实例化为HashMap。所以LinkedHashSet的实现是通过LinkedHashMap实现的。

注意: 无论是HashSet还是LinkedHashSet,它们本质上是一个值(Value)为同一Object(即是源码中的PRESENT)的Map

TreeSet

实现了NavigableSet接口

NavigableSet接口提供了一系列导航方法,例如:

  • lower(E):E
  • floor(E):E
  • ceiling(E):E
  • higher(E):E
  • ...

TreeSet内部持有一个NavigableMap引用,然后在TreeSet的构造方法中将该引用实例化为一个TreeMap对象。和HashSet类似,对HashSet的相关操作基本上都是通过执行TreeMap的相关方法实现的。

以上三者的区别

  • HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放

  • LinkedHashSet:以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代

  • TreeSet:提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快