Java TreeMap 介绍和使用

 

概要

这一章,我们对TreeMap进行学习。
我们先对TreeMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeMap。内容包括:
第1部分 TreeMap介绍
第2部分 TreeMap数据结构
第3部分 TreeMap遍历方式

转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3310928

 

第1部分 TreeMap介绍

TreeMap 简介

TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。
TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合。
TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。
TreeMap 实现了Cloneable接口,意味着它能被克隆
TreeMap 实现了java.io.Serializable接口,意味着它支持序列化

TreeMap基于红黑树(Red-Black tree)实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
TreeMap的基本操作 containsKey、get、put 和 remove 的时间复杂度是 log(n) 。
另外,TreeMap是非同步的。 它的iterator 方法返回的迭代器是fail-fastl的。

 

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

 Map.Entry<K,V>	ceilingEntry(K key) 
          返回一个键-值映射关系,它与大于等于给定键的最小键关联;如果不存在这样的键,则返回 null。
 K	ceilingKey(K key) 
          返回大于等于给定键的最小键;如果不存在这样的键,则返回 null。
 void	clear() 
          从此映射中移除所有映射关系。
 Object	clone() 
          返回此 TreeMap 实例的浅表副本。
 Comparator<? super K>	comparator() 
          返回对此映射中的键进行排序的比较器;如果此映射使用键的自然顺序,则返回 null。
 boolean	containsKey(Object key) 
          如果此映射包含指定键的映射关系,则返回 true。
 boolean	containsValue(Object value) 
          如果此映射为指定值映射一个或多个键,则返回 true。
 NavigableSet<K>	descendingKeySet() 
          返回此映射中所包含键的逆序 NavigableSet 视图。
 NavigableMap<K,V>	descendingMap() 
          返回此映射中所包含映射关系的逆序视图。
 Set<Map.Entry<K,V>>	entrySet() 
          返回此映射中包含的映射关系的 Set 视图。
 Map.Entry<K,V>	firstEntry() 
          返回一个与此映射中的最小键关联的键-值映射关系;如果映射为空,则返回 null。
 K	firstKey() 
          返回此映射中当前第一个(最低)键。
 Map.Entry<K,V>	floorEntry(K key) 
          返回一个键-值映射关系,它与小于等于给定键的最大键关联;如果不存在这样的键,则返回 null。
 K	floorKey(K key) 
          返回小于等于给定键的最大键;如果不存在这样的键,则返回 null。
 V	get(Object key) 
          返回指定键所映射的值,如果对于该键而言,此映射不包含任何映射关系,则返回 null。
 SortedMap<K,V>	headMap(K toKey) 
          返回此映射的部分视图,其键值严格小于 toKey。
 NavigableMap<K,V>	headMap(K toKey, boolean inclusive) 
          返回此映射的部分视图,其键小于(或等于,如果 inclusive 为 true)toKey。
 Map.Entry<K,V>	higherEntry(K key) 
          返回一个键-值映射关系,它与严格大于给定键的最小键关联;如果不存在这样的键,则返回 null。
 K	higherKey(K key) 
          返回严格大于给定键的最小键;如果不存在这样的键,则返回 null。
 Set<K>	keySet() 
          返回此映射包含的键的 Set 视图。
 Map.Entry<K,V>	lastEntry() 
          返回与此映射中的最大键关联的键-值映射关系;如果映射为空,则返回 null。
 K	lastKey() 
          返回映射中当前最后一个(最高)键。
 Map.Entry<K,V>	lowerEntry(K key) 
          返回一个键-值映射关系,它与严格小于给定键的最大键关联;如果不存在这样的键,则返回 null。
 K	lowerKey(K key) 
          返回严格小于给定键的最大键;如果不存在这样的键,则返回 null。
 NavigableSet<K>	navigableKeySet() 
          返回此映射中所包含键的 NavigableSet 视图。
 Map.Entry<K,V>	pollFirstEntry() 
          移除并返回与此映射中的最小键关联的键-值映射关系;如果映射为空,则返回 null。
 Map.Entry<K,V>	pollLastEntry() 
          移除并返回与此映射中的最大键关联的键-值映射关系;如果映射为空,则返回 null。
 V	put(K key, V value) 
          将指定值与此映射中的指定键进行关联。
 void	putAll(Map<? extends K,? extends V> map) 
          将指定映射中的所有映射关系复制到此映射中。
 V	remove(Object key) 
          如果此 TreeMap 中存在该键的映射关系,则将其删除。
 int	size() 
          返回此映射中的键-值映射关系数。
 NavigableMap<K,V>	subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) 
          返回此映射的部分视图,其键的范围从 fromKey 到 toKey。
 SortedMap<K,V>	subMap(K fromKey, K toKey) 
          返回此映射的部分视图,其键值的范围从 fromKey(包括)到 toKey(不包括)。
 SortedMap<K,V>	tailMap(K fromKey) 
          返回此映射的部分视图,其键大于等于 fromKey。
 NavigableMap<K,V>	tailMap(K fromKey, boolean inclusive) 
          返回此映射的部分视图,其键大于(或等于,如果 inclusive 为 true)fromKey。
 Collection<V>	values() 
          返回此映射包含的值的 Collection 视图。


第2部分 TreeMap数据结构

TreeMap的继承关系

java.lang.Object
   ↳     java.util.AbstractMap<K, V>
         ↳     java.util.TreeMap<K, V>

public class TreeMap<K,V>
    extends AbstractMap<K,V>
    implements NavigableMap<K,V>, Cloneable, java.io.Serializable {}

TreeMap与Map关系如下图:

从图中可以看出:
(01) TreeMap实现继承于AbstractMap,并且实现了NavigableMap接口。
(02) TreeMap的本质是R-B Tree(红黑树),它包含几个重要的成员变量: rootsizecomparator
  root 是红黑数的根节点。它是Entry类型,Entry是红黑数的节点,它包含了红黑数的6个基本组成成分:key(键)、value(值)、left(左孩子)、right(右孩子)、parent(父节点)、color(颜色)。Entry节点根据key进行排序,Entry节点包含的内容为value。 
  红黑数排序时,根据Entry中的key进行排序;Entry中的key比较大小是根据比较器comparator来进行判断的。
  size是红黑数中节点的个数。

关于红黑数的具体算法,请参考"红黑树(一) 原理和算法详细介绍"。

第3部分 TreeMap遍历方式

3.1 遍历TreeMap的键值对

第一步:根据entrySet()获取TreeMap的“键值对”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

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

3.2 遍历TreeMap的键

第一步:根据keySet()获取TreeMap的“键”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

// 假设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);
}

3.3 遍历TreeMap的值

第一步:根据value()获取TreeMap的“值”的集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

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


  • 15
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值