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

 

posted @ 2022-08-08 16:40  鼠标的博客  阅读(44)  评论(0编辑  收藏  举报