`
arctg30
  • 浏览: 17708 次
  • 来自: ...
社区版块
存档分类
最新评论

TreeMap

阅读更多

TreeMap定义

与LinkedHashMap不同,TreeMap不是继承于HashMap,而是继承于AbstractMap,归根到底,TreeMap实现的不是hash算法,而是二叉树算法;底层的数据存储也不是数组,而是链表实现的二叉树。二叉树数据结构决定了该map是一个按key进行排序排序的map。定义如下:

......

private final Comparator<? super K> comparator;

private transient Entry<K,V> root = null;

private transient int modCount = 0;

......

 

属性comparator

比较器,在二叉树中进行查找、插入指定的key节点时,就难免与left、parent和right节点的key进行比较,比较算法由comparator提供 若comparator不为空,则执行该comparator的比较算法:

       int cmp = cpr.compare(key, t.key);

若comparator为空,则采用key自身的比较算法:

       cmp = k.compareTo(t.key);

从代码可以看出,当没有提供comparator 时,默认就会将key强制转换为Comparable,然后调用其 compareTo()方法,这就要求key必须实现 Comparable接口,否则将发生ClassCastException。

 

属性root

root是一个用链表实现的二叉树,left.key<parent.key<right.key,具体实现代码如下:

static final class Entry<K,V> implements Map.Entry<K,V> {
        K key;
        V value;
        Entry<K,V> left = null;
        Entry<K,V> right = null;
        Entry<K,V> parent;
        boolean color = BLACK;

        Entry(K key, V value, Entry<K,V> parent) {
            this.key = key;
            this.value = value;
            this.parent = parent;
        }

        public K getKey() {
            return key;
        }

        public V getValue() {
            return value;
        }

        public V setValue(V value) {
            V oldValue = this.value;
            this.value = value;
            return oldValue;
        }

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

        public int hashCode() {
            int keyHash = (key==null ? 0 : key.hashCode());
            int valueHash = (value==null ? 0 : value.hashCode());
            return keyHash ^ valueHash;
        }

        public String toString() {
            return key + "=" + value;
        }
    }

从代码中的” boolean color = BLACK;“可以看出,不仅是二叉树,还是一棵红黑树。红黑树近似平衡, 降低了对旋转的要求,提高了性能。

 

属性modCount

同HashMap一样,该属性用来记录map上的修改(put、remove、clear)次数,以便在对key进行迭代时判断是否发生了并发冲突。

 

 

遍历KeySet

KetSet的Iterator按照前序遍历的方式遍历二叉树中的Key,即从left到parent再到right,即第一个节点是最左边的节点,最后一个节点是最右边的一个节点,代码如下:

//获取第一个节点

final Entry<K,V> getFirstEntry() {
        Entry<K,V> p = root;
        if (p != null)
            while (p.left != null)
                p = p.left;
        return p;
    }

//获取最后一个节点

 final Entry<K,V> getLastEntry() {
        Entry<K,V> p = root;
        if (p != null)
            while (p.right != null)
                p = p.right;
        return p;
    }

 

分享到:
评论

相关推荐

    vue_echarts_treemap.zip

    ECharts 是百度开发的一个基于 JavaScript 的数据可视化库,它提供了丰富的图表类型,包括柱状图、折线图、饼图以及我们关注的 TreeMap。TreeMap 是一种用以表示层次结构数据的可视化方式,通过不同大小的矩形来展示...

    java treemap 学生信息

    在Java编程语言中,`TreeMap` 是一个有序的键值对集合,它实现了 `SortedMap` 接口。这个数据结构内部基于红黑树(Red-Black Tree)算法实现,保证了插入、删除和查找操作的时间复杂度为 O(log n)。在“java treemap...

    java中HashMap,LinkedHashMap,TreeMap,HashTable的区别

    ### Java中HashMap, LinkedHashMap, TreeMap,HashTable的区别 在Java编程语言中,`Map`接口是集合框架中的一个重要组成部分,用于存储键值对。本文将详细分析四种常用的`Map`实现类:`HashMap`, `LinkedHashMap`, ...

    C# Treemap Sunburst算法

    **C# TreeMap与Sunburst算法详解** 在信息可视化领域,数据的呈现方式至关重要,它能够帮助我们更好地理解和分析复杂的数据结构。C#编程语言提供了多种工具和库来实现这一目标,其中Treemap和Sunburst是两种非常...

    java用treemap统计单词出现的个数

    Java TreeMap统计单词出现的次数 Java TreeMap是一个有序的Map实现,它可以根据对象的自然顺序或自定义的比较器对键进行排序。在本例中,我们使用TreeMap来统计一个句子或一个段落中单词出现的次数,并按照字母表...

    Java里多个Map的性能比较(TreeMap、HashMap、ConcurrentSkipListMap)

    在Java编程中,Map接口是用于存储键值对的数据结构,而Java提供了多种Map的实现,包括TreeMap、HashMap和ConcurrentSkipListMap。本文主要比较了这三种Map的性能,尤其是在插入和查找操作上的效率。 1. **TreeMap**...

    treeMap实现分组数据树形结构

    在Java编程中,TreeMap是一种基于红黑树(Red-Black Tree)算法实现的有序映射数据结构。它按照键的自然顺序或者自定义比较器的顺序来存储元素。在这个场景下,`TreeMap`被用来实现数据的分组,并构建一个树形结构,...

    DataV-TreeMap示例

    **DataV-TreeMap示例** DataV是阿里巴巴开源的一款数据可视化工具,它提供了一系列丰富的图表组件,帮助企业或个人快速构建数据展示应用。在DataV中,TreeMap是一种以矩形树状结构来展示层次数据的可视化方法。这种...

    java编写的命令行学生信息管理程序(用treemap)

    这个程序基于`Treemap`数据结构,这是一种在Java中由`java.util.TreeMap`类提供的有序映射,它允许以键值对的形式存储数据,并且能保持键的自然排序或者自定义排序。 `Treemap`的主要特点: 1. **有序性**:`...

    Python TreeMap可视化方案数据源(实现代码,请看我博客专栏《机器学习》)

    本主题聚焦于使用Python的TreeMap进行数据可视化。TreeMap是一种多层嵌套的矩形图,根据数据大小来分配矩形的面积,使得整体布局紧凑且直观。在Python中,我们可以借助Matplotlib库或专门的可视化库如squarify来实现...

    Map,HashMap,TreeMap的使用

    Java 中的 Map、HashMap、TreeMap 使用详解 Map 是 Java 集合框架中的一个接口,用于存储键值对,根据键可以获取值。Map 中的键不允许重复,但值可以重复。在 Java 中,HashMap、LinkedHashMap、TreeMap 都实现了 ...

    Python_TreeMap_可视化方案数据源(实现代码,请看我博客专栏《机器学习》)

    TreeMap是一种有效的数据可视化方法,尤其适用于展示层次结构数据或比较不同类别的相对大小。在这个案例中,我们将探讨如何使用Python中的`Matplotlib`库来实现TreeMap,同时利用提供的`products.csv`, `aisles.csv`...

    treemap treeset hashset hashmap 简要介绍

    在Java编程语言中,集合框架提供了多种数据结构来存储和操作数据,其中`TreeMap`、`TreeSet`、`HashSet`以及`HashMap`是最常用的数据结构之一。这些集合类各自有着独特的特性和应用场景,下面将对它们进行详细介绍。...

    Treemap-4.1.2

    TreeMap是一种数据结构,它是Java集合框架的一部分,位于`java.util`包中。它实现了一个映射接口,其中键(keys)是唯一的,并且通过自然排序或者自定义比较器进行排序。TreeMap内部使用红黑树算法来维护键值对的...

    TreeMap源码

    TreeMap是Java集合框架中的一种有序映射数据结构,它实现了SortedMap接口,提供了按自然顺序或自定义比较器顺序存储键值对的能力。在深入理解TreeMap的源码之前,我们首先要了解其背后的基石——红黑树。 红黑树...

    用Rust编写的 Squarified Treemap算法_rust_代码_下载

    van Wijk 发布的 Squarified Treemap 算法。 用途 假设我们有一个宽度为 6、高度为 4 的矩形,并且进一步假设这个矩形必须细分为 7 个矩形,面积分别为 6、6、4、3、2、2 和 1。标准树形图算法使用一个简单的方法...

    TreeMap按VALUE排序

    TreeMap按VALUE排序

    TreeMap<K,V>类以及LinkedList<E>

    编写一个应用程序,使用TreeMap,V&gt;类,分别按照价格和容量排序并输出10个硬盘的详细信息 9_5.编写一个应用程序,要求将LinkedList创建的对象写入到文件,然后读出一个LinkedList对象,并遍历LinkedList节点中的数据

    List和Treemap排序实例及效率对比

    本资源提供了List对对象中的属性和TreeMap, String&gt;对键值排序,并针对100w条数据排序,对比List和TreeMap, String&gt;排序的效率。个人认为排序效率对比可以相信,但也可能存在不科学之处,还请高手给与指点,多多包涵...

Global site tag (gtag.js) - Google Analytics