2

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());
}

yzwall
120 声望17 粉丝

对大规模分布式系统技术兴趣浓厚