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算法,适用于快速查找场景。
相关文章推荐
- Java常见集合框架(十一):Set之LinkedHashSet、CopyOnWriteArraySet
- java--集合框架的Hashset和Treeset
- java集合Set的应用(HashSet、Tree…
- java 集合框架(TreeSet操作,自动对数据进行排序,重写CompareTo方法)
- Java常见集合框架(九):Set之Set、AbstractSet
- 黑马程序员_Java第14天知识总结_集合类(集合框架)_Collection_迭代器_List_Set_HashSet
- java基础33 Set集合下的HashSet集合和TreeSet集合
- 【Java_集合框架Set】HashSet、LinkedHashSet、TreeSet使用区别
- java基础/集合框架/set/hasset/linkHasset/TreeSet/
- JavaSE入门学习36:Java集合框架之Set接口及其实现类HashSet和TreeSet
- Java基础 集合框架 共性方法 迭代器 ArrayList LinkedList Vector HashSet TreeSet
- java学习笔记:集合框架之TreeSet
- java毕向东听课笔记24(集合框架-Set集合HashSet)
- Java框架集合-Set(HashSet)
- Java数据结构与算法之数据结构-逻辑结构-集合(七)------集合之Set接口和HashSet和TreeSet、LinkedHashSet实现类总结
- Java基础知识强化之集合框架笔记44:Set集合之TreeSet保证元素唯一性和自然排序的原理和图解
- Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序)
- java学习笔记:集合框架之TreeSet
- Java基础知识强化之集合框架笔记42:Set集合之LinkedHashSet的概述和使用
- Java基础知识强化之集合框架笔记45:Set集合之TreeSet存储自定义对象并遍历练习1(自然排序)