TreeMap用法总结

public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, Serializable

TreeMap中的元素默认按照keys的自然排序排列。

(对Integer来说,其自然排序就是数字的升序;对String来说,其自然排序就是按照字母表排序)

构造函数

  • TreeMap():创建一个空TreeMap,keys按照自然排序

    TreeMap<Integer, String> treeMap = new TreeMap<>();
    
  • TreeMap(Comparator comparator):创建一个空TreeMap,按照指定的comparator排序

    TreeMap<Integer, String> map = new TreeMap<>(Comparator.reverseOrder());
    map.put(3, "val");
    map.put(2, "val");
    map.put(1, "val");
    map.put(5, "val");
    map.put(4, "val");
    System.out.println(map); // {5=val, 4=val, 3=val, 2=val, 1=val}
    
  • TreeMap(Map m):由给定的map创建一个TreeMap,keys按照自然排序

    Map<Integer, String> map = new HashMap<>();
    map.put(1, "val");
    ...
    TreeMap<Integer, String> treeMap = new TreeMap<>(map);
    
  • TreeMap(SortedMap m):由给定的有序map创建TreeMap,keys按照原顺序排序

常用方法

增添元素

  • V put(K key, V value):将指定映射放入该TreeMap中
  • V putAll(Map map):将指定map放入该TreeMap中

删除元素

  • void clear():清空TreeMap中的所有元素
  • V remove(Object key):从TreeMap中移除指定key对应的映射

修改元素

  • V replace(K key, V value):替换指定key对应的value值
  • boolean replace(K key, V oldValue, V newValue):当指定key的对应的value为指定值时,替换该值为新值

查找元素

  • boolean containsKey(Object key):判断该TreeMap中是否包含指定key的映射
  • boolean containsValue(Object value):判断该TreeMap中是否包含有关指定value的映射
  • Map.Entry<K, V> firstEntry():返回该TreeMap的第一个(最小的)映射
  • K firstKey():返回该TreeMap的第一个(最小的)映射的key
  • Map.Entry<K, V> lastEntry():返回该TreeMap的最后一个(最大的)映射
  • K lastKey():返回该TreeMap的最后一个(最大的)映射的key
  • v get(K key):返回指定key对应的value
  • SortedMap<K, V> headMap(K toKey):返回该TreeMap中严格小于指定key的映射集合
  • SortedMap<K, V> subMap(K fromKey, K toKey):返回该TreeMap中指定范围的映射集合(大于等于fromKey,小于toKey)

遍历接口

  • Set<Map<K, V>> entrySet():返回由该TreeMap中的所有映射组成的Set对象
  • void forEach(BiConsumer<? super K,? super V> action):对该TreeMap中的每一个映射执行指定操作
  • Collection<V> values():返回由该TreeMap中所有的values构成的集合

其他方法

  • Object clone():返回TreeMap实例的浅拷贝
  • Comparator<? super K> comparator():返回给该TreeMap的keys排序的comparator,若为自然排序则返回null
  • int size():返回该TreepMap中包含的映射的数量

 

TreeMap<Integer, String> treeMap = new TreeMap<>();
treeMap.put(1, "a");
treeMap.put(2, "b");
treeMap.put(3, "c");
treeMap.put(4, "d"); // treeMap: {1=a, 2=b, 3=c, 4=d}

treeMap.remove(4); // treeMap: {1=a, 2=b, 3=c}
int sizeOfTreeMap = treeMap.size(); // sizeOfTreeMap: 3

treeMap.replace(2, "e"); // treeMap: {1=a, 2=e, 3=c}

Map.Entry entry = treeMap.firstEntry(); // entry: 1 -> a
Integer key = treeMap.firstKey(); // key: 1
entry = treeMap.lastEntry(); // entry: 3 -> c
key = treeMap.lastKey(); // key: 3
String value = treeMap.get(3); // value: c
SortedMap sortedMap = treeMap.headMap(2); // sortedMap: {1=a}
sortedMap = treeMap.subMap(1, 3); // sortedMap: {1=a, 2=e}

Set setOfEntry = treeMap.entrySet(); // setOfEntry: [1=a, 2=e, 3=c]
Collection<String> values = treeMap.values(); // values: [a, e, c]
treeMap.forEach((integer, s) -> System.out.println(integer + "->" + s)); 
// output:
// 1 -> a
// 2 -> e
// 3 -> c

遍历方式

  • for循环

    for (Map.Entry entry : treeMap.entrySet()) {
          System.out.println(entry);
    }
    
  • 迭代器循环

    Iterator iterator = treeMap.entrySet().iterator();
    while (iterator.hasNext()) {
          System.out.println(iterator.next());
    }
    

补充:如何选择合适的Map

  • HashMap可实现快速存储和检索,但其缺点是其包含的元素是无序的,这导致它在存在大量迭代的情况下表现不佳。
  • LinkedHashMap保留了HashMap的优势,且其包含的元素是有序的。它在有大量迭代的情况下表现更好。
  • TreeMap能便捷的实现对其内部元素的各种排序,但其一般性能比前两种map差。

LinkedHashMap映射减少了HashMap排序中的混乱,且不会导致TreeMap的性能损失。

<think>好的,我现在需要回答用户关于Java TreeMap常用方法及示例的问题。首先,我得回忆一下TreeMap的基本概念和常用方法。TreeMap是基于红黑树实现的,可以保证键的有序性,默认是自然排序,也可以通过Comparator自定义排序规则。用户提到了引用中的例子,说明他们可能对自定义排序比较感兴趣,所以应该涵盖这部分内容。 接下来,我需要整理常用的方法。比如构造方法,尤其是使用Comparator的例子。然后像put、get、remove这些基本操作。还有导航方法,如firstKey、lastKey、lowerKey、higherKey等,这些是TreeMap特有的,需要详细说明。可能还需要提到视图方法,比如keySet、entrySet,以及迭代方式。 要确保每个方法都有示例代码,并且符合用户提供的引用中的格式。例如,引用[1]和引用[2]展示了如何创建降序排序的TreeMap,所以在构造方法部分要给出类似的示例。另外,用户可能需要知道如何遍历TreeMap,所以迭代器的使用也是重点。 同时,需要检查是否有遗漏的重要方法,比如size、containsKey、containsValue等。不过用户可能更关注与排序和导航相关的方法,所以优先这些。另外,要提到线程不安全的问题,以及在使用自定义Comparator时的注意事项。 最后,根据用户之前的示例,生成相关问题。可能需要包括性能分析、排序优化、应用场景等,但要根据TreeMap的特点来调整,比如红黑树结构的影响、自定义排序的使用场景等。 现在需要组织内容,确保结构清晰,分点列出常用方法,每个方法有说明和代码示例。同时引用提供的参考资料,在合适的地方标注引用标识。还要注意使用中文,保持语言自然,避免使用Markdown格式,但用户这里允许使用代码块。需要确保代码正确,比如泛型的使用、Comparator的写法等。 可能需要先介绍TreeMap的基本概念,然后分常用方法、导航方法、视图方法等部分。每个部分下给出方法和示例。例如: 1. 构造方法:自然排序和自定义排序 2. 添加/获取元素:put, get 3. 删除元素:remove 4. 导航方法:firstKey, lastKey, lowerKey, higherKey, floorKey, ceilingKey 5. 视图方法:keySet, entrySet, values 6. 其他方法:size, containsKey, clear 在每个方法中插入示例代码,比如创建TreeMap时使用Comparator.reverseOrder(),或者自定义Comparator类。引用中的例子可以作为参考,比如引用[1]和引用[2]中的降序排序示例,需要在构造方法部分提到,并标注引用。 需要注意代码的正确性,例如Java的泛型语法,Comparator的导入,以及TreeMap的初始化方式。例如,在自定义Comparator时,可能需要创建一个实现了Comparator接口的类,或者在构造函数中传入Comparator.reverseOrder()。 另外,遍历entrySet的时候,使用Map.Entry的getKey和getValue方法,这也是需要展示的。 最后,生成的相关问题应该围绕TreeMap的特性,比如与HashMap的区别、性能优化、自定义排序的实现、应用场景等。 总结步骤: 1. 概述TreeMap 2. 分点介绍常用方法,每个方法配示例代码 3. 引用提供的资料中的例子,标注引用 4. 生成相关问题</think>### Java TreeMap常用方法及示例 #### 1. 基础特性 TreeMap是基于红黑树实现的有序键值对集合,支持自然排序或通过$Comparator$自定义排序[^1]。默认按键升序排列,插入/查询操作时间复杂度为$O(\log n)$。 #### 2. 常用方法及示例 ##### (1) 构造方法 **自然排序构造** ```java TreeMap<Integer, String> map = new TreeMap<>(); ``` **自定义排序构造** ```java // 降序排列(使用内置Comparator) TreeMap<Integer, String> map1 = new TreeMap<>(Comparator.reverseOrder()); // 自定义Comparator(按字符串长度排序) TreeMap<String, Integer> map2 = new TreeMap<>( (s1, s2) -> s1.length() - s2.length() ); ``` 引用示例中的降序实现方式[^1][^2]。 ##### (2) 添加/获取元素 - `put(K key, V value)` - `get(Object key)` ```java map.put(3, "Apple"); map.put(1, "Banana"); System.out.println(map.get(3)); // 输出: Apple ``` ##### (3) 删除元素 - `remove(Object key)` ```java map.remove(1); // 删除键为1的条目 ``` ##### (4) 导航方法 - `firstKey()` / `lastKey()` ```java System.out.println(map.firstKey()); // 输出最小键 System.out.println(map.lastKey()); // 输出最大键 ``` - `lowerKey(K key)` / `higherKey(K key)` ```java // 小于给定键的最大键 Integer lower = map.lowerKey(3); // 大于给定键的最小键 Integer higher = map.higherKey(3); ``` - `floorEntry(K key)` / `ceilingEntry(K key)` ```java // 小于等于键的条目 Map.Entry<Integer, String> floor = map.floorEntry(2); // 大于等于键的条目 Map.Entry<Integer, String> ceiling = map.ceilingEntry(2); ``` ##### (5) 视图方法 - `keySet()` / `entrySet()` ```java // 遍历键 for (Integer key : map.keySet()) { System.out.println(key); } // 遍历键值对 for (Map.Entry<Integer, String> entry : map.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } ``` ##### (6) 其他方法 - `size()` ```java System.out.println(map.size()); // 输出当前元素数量 ``` - `containsKey(Object key)` ```java if (map.containsKey(5)) { System.out.println("包含键5"); } ``` #### 3. 注意事项 - **线程不安全**:需自行处理同步 - **自定义Comparator**:需确保与键的`equals()`逻辑一致 - **空值支持**:键不能为null(值可为null)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值