`
youyu4
  • 浏览: 442078 次
社区版块
存档分类
最新评论

java - TreeMap

 
阅读更多

java - TreeMap

 

 

特点

 

  • TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。
  • TreeMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
  • TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。
  • TreeMap 基于红黑树(Red-Black tree)实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
  • TreeMap 非同步,所以它的iterator方法返回的迭代器是fail-fastl的。

 

 

扩容

 

    由于TreeMap是基于红黑树的,其根本实现是链表,所以容量是根据增加元素而动态加一。

    TreeMap 和 TreeSet是同样的。

 

 

 

TreeMap的构造函数

 

// 默认构造函数。使用该构造函数,TreeMap中的元素按照自然排序进行排列。
TreeMap()

// 创建的TreeMap包含Map
TreeMap(Map<? extends K, ? extends V> copyFrom)

// 指定Tree的比较器
TreeMap(Comparator<? super K> comparator)

// 创建的TreeSet包含copyFrom
TreeMap(SortedMap<K, ? extends V> copyFrom)

 

 

 

 

TreeMap的API

 

Entry<K, V>                ceilingEntry(K key)
K                          ceilingKey(K key)
void                       clear()
Object                     clone()
Comparator<? super K>      comparator()
boolean                    containsKey(Object key)
NavigableSet<K>            descendingKeySet()
NavigableMap<K, V>         descendingMap()
Set<Entry<K, V>>           entrySet()
Entry<K, V>                firstEntry()
K                          firstKey()
Entry<K, V>                floorEntry(K key)
K                          floorKey(K key)
V                          get(Object key)
NavigableMap<K, V>         headMap(K to, boolean inclusive)
SortedMap<K, V>            headMap(K toExclusive)
Entry<K, V>                higherEntry(K key)
K                          higherKey(K key)
boolean                    isEmpty()
Set<K>                     keySet()
Entry<K, V>                lastEntry()
K                          lastKey()
Entry<K, V>                lowerEntry(K key)
K                          lowerKey(K key)
NavigableSet<K>            navigableKeySet()
Entry<K, V>                pollFirstEntry()
Entry<K, V>                pollLastEntry()
V                          put(K key, V value)
V                          remove(Object key)
int                        size()
SortedMap<K, V>            subMap(K fromInclusive, K toExclusive)
NavigableMap<K, V>         subMap(K from, boolean fromInclusive, K to, boolean toInclusive)
NavigableMap<K, V>         tailMap(K from, boolean inclusive)
SortedMap<K, V>            tailMap(K fromInclusive)

 

 

 

 

数据结构

 

    TreeMap的本质是R-B Tree(红黑树),它包含几个重要的成员变量: root, size, comparator。

 

  • root 是红黑树的根节点。它是Entry类型,Entry是红黑树的节点,它包含了红黑树的6个基本组成成分:key(键)、value(值)、left(左孩子)、right(右孩子)、parent(父节点)、color(颜色)。Entry节点根据key进行排序,Entry节点包含的内容为value。 
  • comparator 红黑数排序时,根据Entry中的key进行排序;Entry中的key比较大小是根据比较器comparator来进行判断的。
  • size 是红黑数中节点的个数。

 

红黑树简介

 

      红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性。同时红黑树更是一颗自平衡的排序二叉树。

 

      我们知道一颗基本的二叉树他们都需要满足一个基本性质--即树中的任何节点的值大于它的左子节点,且小于它的右子节点。按照这个基本性质使得树的检索效率大大提高。我们知道在生成二叉树的过程是非常容易失衡的,最坏的情况就是一边倒(只有右/左子树),这样势必会导致二叉树的检索效率大大降低(O(n)),所以为了维持二叉树的平衡,大牛们提出了各种实现的算法,如:AVL,SBT,伸展树,TREAP ,红黑树等等。

 

      平衡二叉树必须具备如下特性:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。也就是说该二叉树的任何一个等等子节点,其左右子树的高度都相近。



 

红黑树特点

 

  • 每个节点都只能是红色或者黑色
  • 根节点是黑色
  • 每个叶节点(NIL节点,空节点)是黑色的。
  • 如果一个结点是红的,则它两个子节点都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。
  • 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

    说白了,红黑树就是让数据的查找、插入、删除更高效,其检索效率为O(log n)

 

 

红黑树学习文章

 

红黑树系列集锦

红黑树数据结构剖析

红黑树

 

 

 

 

性能问题

 

    在性能上,TreeMap由于要排序,所以插入和删除要比HashMap慢一点,但是如果key是自然顺序或自定义顺序,其实性能上会更好点。

 

 

 

TreeMap遍历方法

 

    TreeMap有顺序遍历和逆序遍历

 

顺序遍历

Iterator<K> keyIterator() {
    return new KeyIterator(getFirstEntry());
}

 

final class KeyIterator extends PrivateEntryIterator<K> {
    KeyIterator(Entry<K,V> first) {
        super(first);
    }
    public K next() {
        return nextEntry().key;
    }
}

 

 

逆序遍历

Iterator<K> descendingKeyIterator() {
    return new DescendingKeyIterator(getLastEntry());
}

 

final class DescendingKeyIterator extends PrivateEntryIterator<K> {
    DescendingKeyIterator(Entry<K,V> first) {
        super(first);
    }
    public K next() {
        return prevEntry().key;
    }
}

 

 

其它遍历一

// 假设map是TreeMap对象
// map中的key是String类型,value是Integer类型
Integer integ = null;
Iterator iter = map.entrySet().iterator();
while(iter.hasNext()) {
    Map.Entry entry = (Map.Entry)iter.next();
    // 获取key
    key = (String)entry.getKey();
        // 获取value
    integ = (Integer)entry.getValue();
}

 

 

其它遍历二

// 假设map是TreeMap对象
// map中的key是String类型,value是Integer类型
String key = null;
Integer integ = null;
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
        // 获取key
    key = (String)iter.next();
        // 根据key,获取value
    integ = (Integer)map.get(key);
}

 

 

其它遍历三

// 假设map是TreeMap对象
// map中的key是String类型,value是Integer类型
Integer value = null;
Collection c = map.values();
Iterator iter= c.iterator();
while (iter.hasNext()) {
    value = (Integer)iter.next();
}

 

  • 大小: 26.2 KB
分享到:
评论

相关推荐

    java集合-TreeMap的使用

    TreeMap是一种基于红黑树实现的有序映射(SortedMap)。它实现了NavigableMap接口,可以按照键的自然顺序或自定义排序规则对键值对进行排序和访问。

    PHP-TreeMap.zip

    `TreeSet`类可能类似于Java集合框架中的`TreeSet`,提供了基于红黑树的有序集合功能,支持元素的添加、删除、遍历等操作,并保持元素的自然顺序。 从压缩包中的"map"文件来看,可能是实现了红黑树的基本操作的类或...

    557.555.JAVA基础教程_集合-TreeMap两种添加方式的使用(557).rar

    Java编程语言中的集合框架是开发过程中不可或缺的一部分,而TreeMap作为集合框架中的一员,它是一种有序的Key-Value存储结构,适用于需要保持插入顺序或按照自然排序的场景。本教程将详细讲解TreeMap的两种主要添加...

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

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

    Voronoi-Treemap-Library:Java库,用于计算Voronoi树图

    Java Voronoi树图库 JVoroTreemap是一个快速的独立Java库,可计算Voronoi树图。 下面的文章包含与此实现有关... git clone --recursive https://github.com/ArlindNocaj/Voronoi-Treemap-Library.git 确保已安装Java和

    计算机后端-Java-Java核心基础-第25章 集合02 16. TreeMap两种添加方式的使用.avi

    计算机后端-Java-Java核心基础-第25章 集合02 16. TreeMap两种添加方式的使用.avi

    Java-master.zip

    在Java中,可以使用`java.util.TreeSet`或`java.util.TreeMap`来实现基于二叉树的集合操作。二叉树操作包括插入、删除、查找以及遍历(前序、中序和后序)。 3. **递归**:递归是一种编程技术,函数在其定义中调用...

    Java-Interview-超全集合github上评分最高的jiva面试题

    - **Map**:HashMap、TreeMap、LinkedHashMap的工作机制,特别是HashMap的线程不安全问题及其解决方案。 - **集合接口与实现**:了解Collection、Iterable、List、Set、Map等接口,以及它们各自的实现类。 3. **...

    java-根据过滤条件显示树形结构

    在Java中,我们通常使用`java.util.TreeSet`、`java.util.TreeMap`或自定义类来实现树的逻辑。对于显示树形结构,我们可以利用`javax.swing.JTree`组件,它是Swing库的一部分,用于创建用户界面中的树视图。 在实现...

    TreeMap in Java_java_treemap_

    Java中的`TreeMap`是一个基于红黑树(Red-Black Tree)数据结构的有序映射容器。它维护了键的自然顺序或者根据提供的比较器进行排序。`TreeMap`类继承自`AbstractMap`,实现了`NavigableMap`、`SortedMap`接口,因此...

    java treemap 学生信息

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

    java 中 TreeMap排序

    在Java编程语言中,`TreeMap`是一种基于红黑树数据结构实现的键值对容器,与`HashMap`不同,`TreeMap`自动按照键的自然顺序或者自定义的比较器进行排序。当我们需要存储的数据有特定的排序需求时,`TreeMap`便成为一...

    java---数据结构

    Java集合框架包括List、Set和Queue接口,以及ArrayList、LinkedList、HashSet、 TreeSet、HashMap、TreeMap等实现类。集合用于存储一组不重复的对象,而Map则关联键值对,提供高效的查找和访问。例如,HashMap以散列...

    java--全家桶课件

    9. **集合框架进阶**:包括并发集合、TreeMap/TreeSet的特性,以及集合的并发修改问题。 10. **Java EE基础**:如Servlet、JSP、MVC架构等,介绍如何构建基于Java的Web应用程序。 这个“Java--全家桶课件”全面...

    corejava--基础教程

    10. **集合框架**:Java集合框架包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)接口及其实现类。理解它们的特点和使用方法,以及迭代器的使用。 11. **多线程**:...

    java-se基础练习代码 Java学习资料

    7. **集合框架**:Java集合框架是存储和操作对象的重要工具,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)。泛型的使用能提高代码的类型安全性。 在“java-se-...

    Java-1premierfg (2).zip

    3. **集合框架**:Java集合框架包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)、Map(如HashMap和TreeMap)等接口和实现类,是处理数据集合的重要工具。 4. **IO/NIO**:Java的输入/输出流(IO)...

    Ace-1-SE-Java-class-libraryl.zip_java class_zip

    2. **集合框架**:Java集合框架是存储和管理对象的强大工具,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)、Map(如HashMap和TreeMap)等接口和实现。 3. **多线程**:Java提供`java.lang....

    java-电子书类 李兴华java教程

    这部分内容包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)接口及其实现类,以及泛型、迭代器和比较器等相关概念。 线程与并发处理是Java的另一大特色。在多核处理器...

Global site tag (gtag.js) - Google Analytics