您的位置:首页 > 编程语言 > Java开发

Java常见集合框架(十):Set之TreeSet、HashSet

2017-10-13 11:46 561 查看

TreeSet

public class TreeSet extends AbstractSet implements NavigableSet, Cloneable, Serializable

基于 TreeMap 的 NavigableSet 实现。

使用元素的自然顺序对元素进行排序(Comparable)。

或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。

非同步,fail-fast。

为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销。

成员变量

//容器中元素以key形式存入TreeMap实例m中
private transient NavigableMap<E, Object> m;
//PRESENT以value形式存入TreeMap实例m的每个key中
private static final Object PRESENT = new Object();


构造方法:

TreeSet(NavigableMap<E, Object> paramNavigableMap) {
this.m = paramNavigableMap;
}
/**
*构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
*/
public TreeSet() {
this(new TreeMap());
}
/**
*构造一个新的空 TreeSet,它根据指定比较器进行排序。
*/
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
/**
*构造一个包含指定 collection 元素的新TreeSet,它按照其元素的自然顺序进行排序。
*/
public TreeSet(Collection<? extends E> c) {
addAll(c);
}
/**
* 构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet。
*/
public TreeSet(SortedSet<E> s) {
this(s.comparator());
addAll(s);
}


常用方法

boolean add(E e):将指定的元素添加到此 set(如果该元素尚未存在于 set 中)。

public boolean add(E e) {
//元素存入TreeMap中,元素为key,PRESENT为value
return (this.m.put(e, PRESENT) == null);
}


Iterator iterator():返回在此 set 中的元素上按升序进行迭代的迭代器。

public Iterator<E> iterator() {
return this.m.navigableKeySet().iterator();
}


boolean remove(Object o):将指定的元素从 set 中移除(如果该元素存在于此 set 中)。

public boolean remove(Object o) {
//通过TreeMap移除元素,并与value值进行比对,判断元素是否存在
return (this.m.remove(o)) == PRESENT;
}


void clear():移除此 set 中的所有元素。

public void clear() {
//通过TreeMap实现clear
this.m.clear();
}


由源码可知,TreeSet对元素的操作均是基于TreeMap的,TreeMap是基于红黑树(Red-Black tree)有序存储,适用于排序场景。

HashSet

public class HashSet extends AbstractSet implements Set, Cloneable, Serializable

基于哈希表(HashMap)实现。

元素存储无序,且再哈希时,元素位置可能会变。

允许使用 null 元素。

非同步,fail-fast。

成员变量:

//元素均存入HashMap的实例m中
private transient HashMap<E,Object> map;
//作为实例m每个key的value
private static final Object PRESENT = new Object();


构造方法(四个):

/**
*   构造一个新的空 set,其底层HashMap 实例的默认初始容量是16,加载因子是0.75。
*/
public HashSet() {
map = new HashMap<E,Object>();
}
/**
*   构造一个包含指定 collection 中的元素的新 set
*/
public HashSet(Collection<? extends E> c) {
map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
/**
*   构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。
*/
public HashSet(int initialCapacity) {
map = new HashMap<E,Object>(initialCapacity);
}
/**
*   构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子。
*/
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<E,Object>(initialCapacity, loadFactor);
}


常用方法:

boolean add(E e):如果此 set 中尚未包含指定元素,则添加指定元素。

public boolean add(E e) {
//元素为key,PRESENT作为value存入HashMap中
return map.put(e, PRESENT)==null;
}


void clear():从此 set 中移除所有元素。

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


boolean remove(Object o):如果指定元素存在于此 set 中,则将其移除。

public boolean remove(Object o) {
//通过hashMap移除元素,并匹配value值,判断set是否包含指定元素o
return map.remove(o) == PRESENT;
}


Iterator iterator():返回对此 set 中元素进行迭代的迭代器。返回元素的顺序并不是特定的。

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


boolean contains(Object o):如果此 set 包含指定元素,则返回 true。

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


由源码可知,HashSet对元素的操作均基于HashMap,基于hash算法,适用于快速查找场景。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐