HashSet & TreeSet小结
声明
文章均为本人技术笔记,转载请注明出处:https://segmentfault.com/u/yzwall
HashSet小结
HashSet简介
HashSet是一个没有重复元素的集;
HashSet可以存储null元素,不保证元素插入顺序;
HashSet线程不安全的(由于底层由HashMap实现);
HashSet底层实现
HashSet底层采用HashMap存储:private transient HashMap<E,Object> map
。HashSet存储元素实际为TreeMap存储的键值对为<key,PRESENT>
的key;,PRESENT为固定对象:private static final Object PRESENT = new Object()
;
由于HashMap中key不可重复,从而实现HashSet元素不可重复;
HashSet遍历方式
HashSet支持迭代器和foreach两种遍历方式:
// 遍历HashSet:迭代器实现
Iterator iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
// 遍历HashSet:foreach实现
for (Integer i : set) {
System.out.println(i);
}
TreeSet小结
TreeSet是一个有序集,基于TreeMap实现,是线程不安全的;
TreeSet有序性实现
TreeSet支持两种两种排序方式,通过不同构造器调用实现
自然排序:
public TreeSet() {
// 新建TreeMap,自然排序
this(new TreeMap<E,Object>());
}
Comparator排序:
public TreeSet(Comparator<? super E> comparator) {
// 新建TreeMap,传入自定义比较器comparator
this(new TreeMap<>(comparator));
}
TreeSet底层实现
TreeSet底层采用TreeMap存储,构造器启动时新建TreeMap。TreeSet存储元素实际为TreeMap存储的键值对为<key,PRESENT>
的key;,PRESENT为固定对象:private static final Object PRESENT = new Object()
TreeSet遍历方式
TreeSet支持正向/反向迭代器遍历和foreach遍历
// 顺序TreeSet:迭代器实现
Iterator iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
// 顺序遍历TreeSet:foreach实现
for (Integer i : set) {
System.out.println(i);
}
// 逆序遍历TreeSet:反向迭代器实现
Iterator iter1 = set.descendingIterator();
while (iter1.hasNext()) {
System.out.println(iter1.next());
}