Java中TreeMap和TreeSet的底层实现

TreeSet底层则采用NavigableMap这个接口来保存TreeSet集合,而实际上NavigableMap只是一个接口,实际上TreeSet还是用TreeMap来保存set元素。

TreeSet初始化的时候会new 一个TreeMap进行初始化;

private transient NavigableMap<E,Object> m;

TreeSet(NavigableMap<E,Object> m) {
        this.m = m;
}

public TreeSet() {
        this(new TreeMap<E,Object>());

}

......

TreeMap采用一种被称为“红黑树”的排序二叉树来保存Map中的的每个Entry——每个Entry都被当做红黑树的一个节点来对待;

TreeMap的插入就是一个“排序二叉树”算法:每当程序添加新节点时,总是从树的根节点开始比较,即将根节点当成当前节点,如果新增节点大于当前节点且当前节点的右节点存在,则以右节点作为当前节点;如果新增节点小于当前节点且当前节点的左节点存在,则以左节点作为当前节点;如果新增节点等于当前节点,则新增节点覆盖当前节点;直到某个节点的左右节点不存在,并结束循环;将新增的节点作为该节点的子节点,如果新增的节点大于该节点,则添加成该节点的右节点,如果新增的节点小于该节点,则添加成该节点的左节点;

TreeMap 根据Key来获取value。

相同点:

(1)都是有序集合,也就是说他们存储的值(key)都是排好序的。

(2)都是非同步的,因此它们不能在多线程之间共享,不过可以使用方法Collections.synchroinzedMap()或者Collections.synchroinzedSet()来实现同步。

(3)运行速度都要比Hash集合慢,它们内部对元素的操作时间复杂度为O(logN),而HashMap和HashSet则为O(1)。

不同点:

(1)TreeSet和TreeMap实现的接口规范不同,分别实现Set和Map接口。

注意:

TreeSet和TreeMap要求存放的对象(对TreeMap来说是键值对映射的键)所属的类必须实现Comparable接口(或者通过Comparator实例化TreeSet和TreeMap对象),该接口提供了比较元素的compareTo()方法,当插入元素时会调用该方法比较元素的大小。

补充:

Collections工具类的sort方法有两种重载的形式:sort(List<T> list) 与sort(List<T> list, Comparator<? super T> c)

第一种要求传入的待排序容器中存放的对象所属的类必须实现Comparable接口以实现元素的比较。
第二种不强制要求待排序容器中存放的对象所属的类必须实现Comparable接口,但是要求传入第二个参数,这个参数是Comparator接口的子类型(需要重写compare方法实现元素的比较),相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法,也是对回调模式的应用(Java中对函数式编程的支持)。
---------------------

原文地址:https://www.cnblogs.com/HeySwing-1995/p/9837549.html

时间: 2024-10-15 16:26:26

Java中TreeMap和TreeSet的底层实现的相关文章

java中treemap和treeset实现(红黑树)

TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点. TreeSet 和 TreeMap 的关系 为了让大家了解 TreeMap 和 TreeSet 之间的关系,下面先看 TreeSet 类的部分源代码: public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializab

JAVA中TreeMap集合筛选字母及每一个字符出现的次数

利用TreeMap对字符串进行排序 题目要求: 给出一个字符串:fjdjskgfhbsjkgjnsrgnaHNGKEURHGASLGNw5y74236720573. 要求: 化成字符串a(字符的个数)b()c()... 区分大小写 只读取字母 直接上代码: import java.util.Map; import java.util.Set; import java.util.TreeMap; ? /** * @Author caozy * @Date 2020/1/10 18:18 * @Ve

JDK学习---深入理解java中的LinkedList

本文参考资料: 1.<大话数据结构> 2.http://blog.csdn.net/jzhf2012/article/details/8540543 3.http://blog.csdn.net/jzhf2012/article/details/8540410 4.http://www.cnblogs.com/ITtangtang/p/3948610.html 5.http://blog.csdn.net/zw0283/article/details/51132161 本来在分析完HashSe

TreeMap和TreeSet即Java中利用二叉搜索树实现的Map和Set

一:概念二叉搜索树又称二叉排序树,它或者是一棵空树**,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树. 二:操作--查找先和根节点做对比,相等返回,如果不相等,关键码key>根节点key,在右子树中找(root=root.rightChild)关键码key<根节点key,在左子树中找(root=root.leftChild)否则返回false 三:操作--插入根据二

java中TreeSet集合如何实现元素的判重

1 /* 2 看一下部分的TreeSet源码.... 3 public class TreeSet<E> extends AbstractSet<E> 4 implements NavigableSet<E>, Cloneable, java.io.Serializable 5 { 6 private transient NavigableMap<E,Object> m; 7 //NavigableMap继承SortedMap, 二者都是接口,在TreeMa

Java中常见数据结构:list与map -底层如何实现

1:集合 2 Collection(单列集合) 3 List(有序,可重复) 4 ArrayList 5 底层数据结构是数组,查询快,增删慢 6 线程不安全,效率高 7 Vector 8 底层数据结构是数组,查询快,增删慢 9 线程安全,效率低 10 LinkedList 11 底层数据结构是链表,查询慢,增删快 12 线程不安全,效率高 13 Set(无序,唯一) 14 HashSet 15 底层数据结构是哈希表. 16 哈希表依赖两个方法:hashCode()和equals() 17 执行顺

TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?

TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小.TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序.Collections工具类的sort方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象比较实现Comparable接口以实现元素的比较:第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator接

Java中HashMap和TreeMap的区别深入理解

首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对. HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的). HashMap 非线程安全 TreeMap 非线程安全 线程安全 在Java里,线程安全一般体

java学习笔记——Java中HashMap和TreeMap的区别深入理解

本文转载自Java中HashMap和TreeMap的区别深入理解 首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对. HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的). HashMap 非线程安全