当前位置: 代码迷 >> 综合 >> HashSet/TreeSet
  详细解决方案

HashSet/TreeSet

热度:79   发布时间:2024-01-28 16:10:30.0

 

很多人都知道HashMap, ConcurrentHashMap.但是可能对HashSet 和TreeSet 了解不多。

 

1. HashSet 是一个去重复的set集合

  内部实现,其实很简单就是包装了一下HashMap, 主要使用到key, Value是固定的 private static final Object PRESENT = new Object();

看看基础定义:

 static final long serialVersionUID = -5024744406713321676L;private transient HashMap<E,Object> map;// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();/*** Constructs a new, empty set; the backing <tt>HashMap</tt> instance has* default initial capacity (16) and load factor (0.75).*/public HashSet() {map = new HashMap<>();}

 再来看看add方法, 实际操作是往map里面put key和一个常量, 如果不存在那么hashMap返回值没null,

    public boolean add(E e) {return map.put(e, PRESENT)==null;}

同理还是有remove 方法

  public boolean remove(Object o) {return map.remove(o)==PRESENT;}

相信通过上面说明,对HashSet的底层实现应该有所了解

2.TreeMap 是一个有序的Map, 很容易想到,对Key进行了排序。

看看treeMap的基础属性定义, 关键因素就是看看private transient Entry<K,V> root到底是什么了。

 /*** The comparator used to maintain order in this tree map, or* null if it uses the natural ordering of its keys.** @serial, 这个很容易想到是用来排序的*/private final Comparator<? super K> comparator;// 这个是存储具体对象的数据结构private transient Entry<K,V> root;/*** The number of entries in the tree*/private transient int size = 0;/*** The number of structural modifications to the tree.*/private transient int modCount = 0;

看到这个属性定义,可以知道,TreeMap 是一颗红黑树的实现。 红黑树是一个不完全的有序的二叉树。

 static final class Entry<K,V> implements Map.Entry<K,V> {K key;V value;Entry<K,V> left;Entry<K,V> right;Entry<K,V> parent;boolean color = BLACK;/*** Make a new cell with given key, value, and parent, and with* {@code null} child links, and BLACK color.*/Entry(K key, V value, Entry<K,V> parent) {this.key = key;this.value = value;this.parent = parent;}

 

通过上面2个代码的查看,总结如下:

HashSet 内部是用来Hashmap的key作为set集合

TreeMap 内部使用了红黑树来实现有序。