TreeMap和TreeSet
TreeMap
HashMap是完全散列的键值对结合
LinkedHashMap是可以保存操作顺序的键值对集合(插入和访问)
TreeMap是可以保证插入后的键值对按key的自然顺序排列的集合
继承结构
类注释和说明
1、TreeMap是基于NavigableMap实现的一个红黑树结构,红黑树就是自平衡二叉查找树(根据二叉查找树,平衡二叉查找树的特性和定义来推理理解)
2、按照key的自然顺序(升序),或TreeMap被创建时提供的Comparator的顺序排序
3、containsKey,get,put,remove方法的时间复杂度都是log(n)
public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.Serializable
核心属性和Entry
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;
树节点的结构
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; //比较两个节点是否相等的方法,需要同时比较key和value public boolean equals(Object o) { if (!(o instanceof Map.Entry)){ return false; } Map.Entry<?,?> e = (Map.Entry<?,?>)o; return valEquals(key,e.getKey()) && valEquals(value,e.getValue()); } //hashCode计算是key和value的hashCode再异或 public int hashCode() { int keyHash = (key==null ? 0 : key.hashCode()); int valueHash = (value==null ? 0 : value.hashCode()); return keyHash ^ valueHash; } }
TreeSet
HashSet可以保证插入的元素不重复
LinkedHashSet可以保证插入的元素不重复,且保证插入的顺序
TreeSet可以保证元素不重复且插入后保持一定的顺序
add,remove,contains方法时间复杂度为log(n)
需要同步的TreeSet,用 SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
和HashSet使用HashMap实现类似,TreeSet也使用TreeMap实现
构造函数
TreeSet(NavigableMap<E,Object> m) { this.m = m; } public TreeSet() { this(new TreeMap<E,Object>()); } public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<>(comparator)); } public TreeSet(Collection<? extends E> c) { this(); addAll(c); } public TreeSet(SortedSet<E> s) { this(s.comparator()); addAll(s); }