简述TreeMap底层原理
TreeMap实现类的结构关系:
TreeMap特点:
- TreeMap实现Map接口
- 底层是红黑树(又名自平衡二叉查找树)
- TreeMap中的元素,key是升序的唯一,value是无序,不唯一
TreeMap源码中的,该内部类,就是下面所说的节点Entry,这其中中包含了两个主要的值,key和value,还有以及左右节点和根节点信息
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;//
}
说到了自平衡二叉查找树就不得说下,什么是查找树和自平衡树了
平衡二叉树:它是或者它的左右子树的的高度差不超过1,并且左右子树也是平衡二叉树
查找二叉树:所有左子树的比根节点小,所有右子树都比根节点大(正是有这中结构,才会有TreeMap中的key有序)
所以,自平衡二叉查找树就就是两种树形的结合,就是红黑树(自平衡二叉查找树)
补充完上面的概念后就可以看TreeMap的底层原理,这里我们不看源码,只阐述其中的思想:
TreeMap集合的主要的两个方法put(key,value),get(key)
- put(key,value):当我们调用该方法时,首先会以根节点为当前节点,通过比较添加的节点与根节点的大0小,当该节点大于根节点且该根节点有右子节点,将会将该右字节点继续比较;当该节点小于根节点且该节点有左子节点时,将会将该左字节点继续比较;当该节点和根节点相等时,此时将会覆盖此处的值;依次重复比较,直到找到该位置,即当小于根节点就将该节点挂在该根节点的左节点上,当大于根节点就将该节点挂在该根节点的右子树上
- get(key):通过key值找value值,首先从根节点作为起始位置,和根节点的key值进行比较,如果大于该根节点,说明该key位置在根节点的右侧,将根节点的右节点作为新的根节点,继续比较(这其中就排除了另根的左子树上所有的集合,类似折半查找的思想,提高了查找的效率);同理,如果小于根节点的key值,说明在该key在根节点的左侧,将根节点的左节点作为新的根节点,继续比较;如果根节点的key和我们的key值相等,则说明此时找到到了该值,将该节点的value值进行返回即可;不断地重复上述(类似递归的思想),直到找到对应key值
以上两点总结