数据结构与集合(八) --- Map类集合之(TreeMap)

本文详细介绍了Java中的TreeMap数据结构,它是一个基于红黑树实现的有序Map。文章讲解了TreeMap的Key有序性、与HashMap的区别以及如何利用Comparable或Comparator实现Key去重。通过对put()方法、源码解析和红黑树平衡策略的实例分析,展示了TreeMap在插入、删除和查找操作上的高效性。虽然时间复杂度高于HashMap,但在需要排序的场景下,TreeMap的表现更优。此外,文章还提到了多线程环境下TreeMap的线程不安全性,以及与HashMap和ConcurrentHashMap的关联。
摘要由CSDN通过智能技术生成


一、TreeMap概述

TreeMap是按照Key的排序结果组织内部结构的Map集合, 它改变了Map 类散乱无序的形象. 在 Key 有排序要求的场景下,使用TreeMap可以事半功倍. 在集合框架图中,ConcurrentHashMap、HashMap和TreeMap都继承于AbstractMap抽象类,他们的关系如图所示:
在这里插入图片描述

在TreeMap 的接口继承树中,有两个与众不同的接口: SortedMap 和 NavigableMap。SortedMap 接口表示它的Key 是有序不可重复的,支持获取头尾Key-Value 元素,或者根据Key指定范围获取子集合等。插入的Key必须实现Comparable 或提供额外的比较器Comparator,所以Key不允许为null,但是Value 可以

二、TreeMap添加使用案例

NavigableMap 接口继承了 SortedMap 接口,根据指定的搜索条件返回最匹配的Key-Value 元素。不同于HashMap,TreeMap并非一定要覆写hashCode 和 equals 方法来达到key 去重的目的.

public class TreeMapRepeat {
   
    public static void main(String[] args) {
   
        // 如果仅把此处的TreeMap换成HashMap 的话,此处size=1;
        TreeMap map = new TreeMap();
    }
}

class Key implements Comparable<Key>{
   

    @Override
    // 返回负的常数,表示此对象永远小于输入的other对象,此处决定TreeMap 的 size=2
    public int compareTo(Key other) {
   
        return -1;
    }
    
    // hash是相等的
    @Override
    public int hashCode() {
   
        return 1;
    }

    // equals 比较也是相等的
    @Override
    public boolean equals(Object obj) {
   
        return true;
    }
}

上述示例中的TreeMap 换成 HashMap, size 的结果则从2变成1. 注意HashMap 是使用hashCode 和 equals 实现去重的. 而TreeMap 依靠 Comparable 或Comparator 来实现Key的去重. 如果没有覆盖正确的方法,那么TreeMap 的最大特性将无法发挥出来, 甚至在运行时会出现异常. 如果要用TreeMap对Key进行排序,调用如下方法:

final int compare(Object k1, Object k2){
   
	return comparator == null
		? ((Comparable<? super K> k1).compareTo((K)k2))
		: comparator.compara((K)k1, (K)k2);
}

如果Comparator 不为null,优先使用比较器 comparator 的compara 方法; 如果为null ,则使用Key 实现的自然排序 Comparable 接口的comparaTo 方法.如果两者都不满足,则抛出ClassCastException 异常.

三、红黑树实现TreeMap源码解析

基于红黑树实现的 TreeMap 提供了平均和最坏复杂度均为O(logn) 的增删改查操作,并且实现了NavigableMap 接口,该集合最大的特点是Key 的有序性. 先从类名和属性开始分析:

3.1 类名和属性源码解析

public class TreeMap<K,V>
    extends AbstractMap<K,V>
    implements NavigableMap<K,V>, Cloneable, java.io.Serializable
{
   
	// 排序使用的比较器
	private final Comparator<? super K> comparator;
	// 根节点
	private transient Entry<K,V> root;
	...
	// 定义成为有字面含义的常量
	private static final boolean RED = false;
	private static final boolean BLACK <
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值