TreeMap简介
在Map集合框架中,除了HashMap以外,TreeMap也是常用到的集合对象之一。
与HashMap相比,TreeMap是一个能比较元素大小的Map集合,会对传入的key进行了大小排序。其中,可以使用元素的自然顺序,也可以使用集合中自定义的比较器来进行排序;
不同于HashMap的哈希映射,TreeMap实现了红黑树的结构,形成了一颗二叉树。
TreeMap继承于AbstractMap,实现了Map, Cloneable, NavigableMap, Serializable接口。
(1)TreeMap 继承于AbstractMap,而AbstractMap实现了Map接口,并实现了Map接口中定义的方法,减少了其子类继承的复杂度;
(2)TreeMap 实现了Map接口,成为Map框架中的一员,可以包含着key-value形式的元素;
(3)TreeMap 实现了NavigableMap接口,意味着拥有了更强的元素搜索能力;
(4)TreeMap 实现了Cloneable接口,实现了clone()方法,可以被克隆;
(5)TreeMap 实现了Java.io.Serializable接口,支持序列化操作;
TreeMap具有如下特点:
不允许出现重复的key;
可以插入null键,null值;
可以对元素进行排序;
无序集合(插入和遍历顺序不一致);
TreeMap基本操作
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
public class TreeMapTest { public static void main(String[] agrs){ //创建TreeMap对象: TreeMap<String,Integer> treeMap = new TreeMap<String,Integer>(); System.out.println("初始化后,TreeMap元素个数为:" + treeMap.size()); //新增元素: treeMap.put("hello",1); treeMap.put("world",2); treeMap.put("my",3); treeMap.put("name",4); treeMap.put("is",5); treeMap.put("huangqiuping",6); treeMap.put("i",6); treeMap.put("am",6); treeMap.put("a",6); treeMap.put("developer",6); System.out.println("添加元素后,TreeMap元素个数为:" + treeMap.size()); //遍历元素: Set<Map.Entry<String,Integer>> entrySet = treeMap.entrySet(); for(Map.Entry<String,Integer> entry : entrySet){ String key = entry.getKey(); Integer value = entry.getValue(); System.out.println("TreeMap元素的key:"+key+",value:"+value); } //获取所有的key: Set<String> keySet = treeMap.keySet(); for(String strKey:keySet){ System.out.println("TreeMap集合中的key:"+strKey); } //获取所有的value: Collection<Integer> valueList = treeMap.values(); for(Integer intValue:valueList){ System.out.println("TreeMap集合中的value:" + intValue); } //获取元素: //获取集合内元素key为"huangqiuping"的值 Integer getValue = treeMap.get("huangqiuping"); //获取集合内第一个元素 String firstKey = treeMap.firstKey(); //获取集合内最后一个元素 String lastKey =treeMap.lastKey(); //获取集合内的key小于"huangqiuping"的key String lowerKey =treeMap.lowerKey("huangqiuping"); //获取集合内的key大于等于"huangqiuping"的key String ceilingKey =treeMap.ceilingKey("huangqiuping"); //获取集合的key从"a"到"huangqiuping"的元素 SortedMap<String,Integer> sortedMap =treeMap.subMap("a","my"); //删除元素: //删除集合中key为"huangqiuping"的元素 Integer removeValue = treeMap.remove("huangqiuping"); //清空集合元素: treeMap.clear(); //判断方法: //判断集合是否为空 boolean isEmpty = treeMap.isEmpty(); //判断集合的key中是否包含"huangqiuping" boolean isContain = treeMap.containsKey("huangqiuping"); }} |
TreeMap排序
(1)使用元素自然排序
在使用自然顺序排序时候,需要区分两种情况:一种是Jdk定义的对象,一种是自己定义的对象;
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
<font style="color:rgb(77, 77, 77)"><font face="""><font style="font-size:16px">public class SortedTest implements Comparable<SortedTest> { private int age; public SortedTest(int age){ this.age = age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //自定义对象,实现compareTo(T o)方法: public int compareTo(SortedTest sortedTest) { int num = this.age - sortedTest.getAge(); //为0时候,两者相同: if(num==0){ return 0; //大于0时,传入的参数小: }else if(num>0){ return 1; //小于0时,传入的参数大: }else{ return -1; } }}public class TreeMapTest { public static void main(String[] agrs){ //自然顺序比较 naturalSort(); } //自然排序顺序: public static void naturalSort(){ //第一种情况:Integer对象 TreeMap<Integer,String> treeMapFirst = new TreeMap<Integer, String>(); treeMapFirst.put(1,"huangqiuping"); treeMapFirst.put(6,"huangqiuping"); treeMapFirst.put(3,"huangqiuping"); treeMapFirst.put(10,"huangqiuping"); treeMapFirst.put(7,"huangqiuping"); treeMapFirst.put(13,"huangqiuping"); System.out.println(treeMapFirst.toString()); //第二种情况:SortedTest对象 TreeMap<SortedTest,String> treeMapSecond = new TreeMap<SortedTest, String>(); treeMapSecond.put(new SortedTest(10),"huangqiuping"); treeMapSecond.put(new SortedTest(1),"huangqiuping"); treeMapSecond.put(new SortedTest(13),"huangqiuping"); treeMapSecond.put(new SortedTest(4),"huangqiuping"); treeMapSecond.put(new SortedTest(0),"huangqiuping"); treeMapSecond.put(new SortedTest(9),"huangqiuping"); System.out.println(treeMapSecond.toString()); }}</font></font></font> |
在自然顺序比较中,需要让被比较的元素实现Comparable接口,否则在向集合里添加元素时报:"java.lang.ClassCastException: com.huangqiuping.collection.map.SortedTest cannot be cast to java.lang.Comparable"异常;
这是因为在调用put()方法时,会将传入的元素转化成Comparable类型对象,所以当你传入的元素没有实现Comparable接口时,就无法转换,遍会报错;
(2)使用自定义比较器排序
使用自定义比较器排序,需要在创建TreeMap对象时,将自定义比较器对象传入到TreeMap构造方法中;
自定义比较器对象,需要实现Comparator接口,并实现比较方法compare(To1,To2);
使用自定义比较器排序的话,被比较的对象无需再实现Comparable接口了;
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
public class SortedTest { private int age; public SortedTest(int age){ this.age = age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }}public class SortedTestComparator implements Comparator<SortedTest> { //自定义比较器:实现compare(To1,To2)方法: public int compare(SortedTest sortedTest1, SortedTest sortedTest2) { int num = sortedTest1.getAge() - sortedTest2.getAge(); if(num==0){//为0时候,两者相同: return 0; }else if(num>0){//大于0时,后面的参数小: return 1; }else{//小于0时,前面的参数小: return -1; } }} |
TreeMap简介的更多相关文章
- Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
概要 这一章,我们对TreeMap进行学习.我们先对TreeMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeMap.内容包括:第1部分 TreeMap介绍第2部分 TreeMa ...
- TreeMap源码
一.TreeMap简介 TreeMap是基于红黑树的java版实现,作者Josh Bloch and Doug Lea(这二人在java发展的早期做了重大贡献,比如集合框架JDK1.2.并发包JDK1 ...
- 33、Map简介
Map接口概述 除了Collection之外,常用的集合还有Map接口,里面常用的实现类图如下: map中的元素是以键-值的方式存在的,通过键可以获取到值,键是不可以重复的,跟地图比较像,通过一个坐标 ...
- 关于java集合类TreeMap的理解(转)
概要 这一章,我们对TreeMap进行学习. 转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=33109 ...
- Java集合 之Map(HashMap、Hashtable 、TreeMap、WeakHashMap )理解(new)
HashMap 说明: 在详细介绍HashMap的代码之前,我们需要了解:HashMap就是一个散列表,它是通过“拉链法”解决哈希冲突的.还需要再补充说明的一点是影响HashMap性能的有两个参数:初 ...
- 【java基础】java集合之TreeMap
转载文章转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3310928 第1部分 TreeMap介绍 T ...
- TreeMap详细介绍(源码解析)和使用示例
本文转自 http://www.cnblogs.com/skywang12345/p/3310928.html 概要 这一章,我们对TreeMap进行学习.我们先对TreeMap有个整体认识,然后再学 ...
- 1-28Map简介
Map接口概述 除了Collection之外,常用的集合还有Map接口,里面常用的实现类图如下: map中的元素是以键-值的方式存在的,通过键可以获取到值,键是不可以重复的,跟地图比较像,通过一个坐标 ...
- 【转】Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
概要 这一章,我们对TreeMap进行学习.我们先对TreeMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeMap.内容包括:第1部分 TreeMap介绍第2部分 TreeMa ...
随机推荐
- Unity3d游戏代码保护
现在的游戏项目如果达到一定规模.项目比较创新方竞争对手.项目严重依赖客户端代码那么代码保护还是尽量做,如果不是也没必须瞎折腾. Unity常见代码保护机制: 1.重新编译mono,修改mono_ima ...
- 视频课程 | Kubernetes的兴起
视频课程 | Kubernetes的兴起 原创: 京小云 京东云开发者社区 4月3日 京东云开发者社区在3月底于北京举行了以"Cloud Native时代的应用之路与开源创新"为 ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习: DOM - 改变 HTML
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Animate.css 一款强大的预设css3动画库
Animate.css是一个有趣的,跨浏览器的css3动画库.很值得我们在项目中引用. 用法 1.首先引入animate css文件 <head> <link rel="s ...
- ruoyi ShiroUtils
package com.ruoyi.framework.util; import org.apache.shiro.SecurityUtils; import org.apache.shiro.cry ...
- pandas(二)
1.Series序列 一维的数组数据,构建是传二维数据会报错,数据具有索引,构建时如果不传索引,默认为数字rang索引. series存在列名和索引,sr.at[0]是通过列名来定位数据(iat定位行 ...
- sklearn连续型数据离散化
二值化 设置一个condition,把连续型的数据分类两类.比如Age,大于30,和小于30. from sklearn.preprocessing import Binerize as Ber x ...
- Filezilla Xshell SecureFX Win10等无法拖放文件(本地或线上)解决办法
一.win10系统Filezilla Xshell SecureFX等无法拖放文件到线上服务器解决办法: 1.按窗口键+R,打开“运行”对话框:输入regedit回车 2.在注册表编辑器地址栏输入以下 ...
- swoole使用协程
协程:协程可以理解为纯用户态的线程,其通过协作而不是抢占来进行切换.相对于进程或者线程,协程所有的操作都可以在用户态完成,创建和切换的消耗更低.Swoole可以为每一个请求创建对应的协程,根据IO的状 ...
- Java集合详解(全)
Java的集合主要有List , Set, Map List , Set继承至Collection接口,Map为独立接口 List下有ArrayList,LinkedList,Vector Set下有 ...