简述TreeMap底层原理

简述TreeMap底层原理

TreeMap实现类的结构关系:
在这里插入图片描述
TreeMap特点:

  1. TreeMap实现Map接口
  2. 底层是红黑树(又名自平衡二叉查找树)
  3. 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值

以上两点总结

发布了5 篇原创文章 · 获赞 1 · 访问量 132

猜你喜欢

转载自blog.csdn.net/qq_43413036/article/details/102675812