(1)TreeMap类通过使用红黑树实现Map接口

(2)TreeMap提供按排序顺序存储键值对的有效手段,同时允许快速检索

(3)不同于散列映射,树映射保证它的元素按键的自然顺序升序排列

(4)TreeMap构造方法:
TreeMap()
TreeMap(Comparator comp)
TreeMap(Map m)
TreeMap(SortedMap sm)

(5)TreeMap实现SortedMap并且扩展AbstractMap,它本身并没有定义其他方法

JDK中对treemap的定义如下:

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

SortedMap 接口的基于红黑树的实现。此类保证了映射按照升序顺序排列关键字,根据使用的构造方法不同,可能会按照键的类的自然顺序 进行排序(参见 Comparable),或者按照创建时所提供的比较器进行排序。

treemap构造方法

TreeMap的key存储引用类型数据,需要满足一定条件:

要么引用类型实现Comparable接口,要么在构建TreeMap对象时,为该TreeMap容器提供实现Comparator接口的比较器对象

 package com.iotek.treemap;

 import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap; public class TreeMapDemo1 { /**
* @param args
*/
public static void main(String[] args) {
TreeMap<String, String> tmap = new TreeMap<String, String>();
tmap.put("jack", "zhangsan");
tmap.put("mary", "xiaohong");
tmap.put("rose", "xiaozhang");
tmap.put("free", "xiaoming");
tmap.put("rose", "chenming");
System.out.println(tmap);
// 输出结果是,第三个put进去的键值对被重名的后添加的键对应的键值对替换了,键是唯一的
Set<Entry<String, String>> entrys = tmap.entrySet();
/*
* 用entrySet()方法返回map容器中的entry对象,然后用foreach来遍历键值对,
* 用一个Entry类型的引用变量entry,调用entry的getKey 和getValue方法
*/
for (Entry<String, String> entry : entrys) {
System.out.println(entry.getKey() + "--" + entry.getValue());
} } }

 package com.iotek.treemap;

 import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap; public class TreeMapDemo2 { /**
* @param args
*/
public static void main(String[] args) {
TreeMap<Person, String> pdata = new TreeMap<Person, String>();
// 构造一个新的空映射,该映射根据给定的比较器进行排序
pdata.put(new Person("zhangsan", 30), "张三");
pdata.put(new Person("lisi", 31), "李四");
pdata.put(new Person("rose", 32), "玫瑰");
pdata.put(new Person("zhangsan", 33), "张三");
Set<Entry<Person, String>> entrys = pdata.entrySet();
for (Entry<Person, String> entry : entrys) {
System.out.println(entry.getKey() + "--" + entry.getValue());
}
// 如果Person类不实现Comparable接口,会报错。因为默认对象作为键名时,不会实现Comparable接口
} } class Person implements Comparable<Person> {
private String name;
private int age; public Person(String name, int age) {
super();
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public int compareTo(Person o) { //按age的自然顺序进行升序排序
if (this.age - o.getAge() > 0) { // 如果当前Person对象的age比形参的Person对象的age大,则返回1
// 如果o1的age大于o2的age,就放在二叉树节点的右边
return 1;
} else if (this.age - o.getAge() < 0) {
return -1;
}
return 0;
} @Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
} }

结果:按照年龄升序排序:

按照名字和age排序:

 package com.iotek.treemap;

 import java.util.Comparator;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap; public class TreeMapDemo3 { public static void main(String[] args) {
// TreeMap的构造方法:TreeMap(Comparator<? super K> c)/
// 构造一个新的空映射,该映射根据给定的比较器进行排序
TreeMap<Person1, String> pdata = new TreeMap<Person1, String>(
new Comparator<Person1>() {
@Override
public int compare(Person1 o1, Person1 o2) {
if (o1.getName().compareTo(o2.getName()) > 0) {
/* o1.getName()得到的是字符串,调用其 compareTo()方法,该方法按字符串的自然顺序进行排序(字符串比较大小) */
return 1;
} else if (o1.getName().compareTo(o2.getName()) < 0) {
return -1;
} else { // 当名字相同时,再按照年龄来比较
return o1.getAge() - o2.getAge();
}
} }); pdata.put(new Person1("zhangsan", 30), "张三");
pdata.put(new Person1("lisi", 31), "李四");
pdata.put(new Person1("rose", 32), "玫瑰");
pdata.put(new Person1("zhangsan", 33), "张三");
Set<Entry<Person1, String>> entrys = pdata.entrySet();
for (Entry<Person1, String> entry : entrys) {
System.out.println(entry.getKey() + "--" + entry.getValue());
} } } /*
* 按字符串的自然顺序进行排序(字符串比较大小):String类的方法 int
* compareTo(String anotherString) 按字典顺序比较两个字符串。
* anotherString - 要比较的 String。 返回:如果参数字符串等于此字符串, 则返回 0
* 值; 如果按字典顺序此字符串小于字符串参数,则返回一个小于 0 的值;如果按字典顺序此字符串
* 大于字符串参数, 则返回一个大于 0 的值。
*/
/* o1.getName()得到的是字符串,调用其 compareTo()方法 */ class Person1 {
private String name;
private int age; public Person1(String name, int age) {
super();
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Person1 [name=" + name + ", age=" + age + "]";
} }

结果如下:

 

ht-5 treemap特性的更多相关文章

  1. TreeMap就这么简单【源码剖析】

    前言 声明,本文用得是jdk1.8 前面章节回顾: Collection总览 List集合就这么简单[源码剖析] Map集合.散列表.红黑树介绍 HashMap就是这么简单[源码剖析] LinkedH ...

  2. 从头认识java-15.7 Map(7)-TreeMap与LinkedHashMap

    这一章节我们来讨论一下Map两个比較经常使用的实现:TreeMap与LinkedHashMap. 1.TreeMap 特性:依照key来排序 package com.ray.ch14; import ...

  3. JAVA集合框架(三)-Map

    前言 Map是java中用于存储键值对映射的接口.是解决编程问题最常用的数据结构之一.在工作中,有时候为实现一个功能可能写了好大一段代码,运行是ok了,但是就是不想回头再看,不敢相信自己写的这么烂.这 ...

  4. 2020了你还不会Java8新特性?(五)收集器比较器用法详解及源码剖析

    收集器用法详解与多级分组和分区 为什么在collectors类中定义一个静态内部类? static class CollectorImpl<T, A, R> implements Coll ...

  5. 2020你还不会Java8新特性?

    Java8(1)新特性介绍及Lambda表达式 前言: 跟大娃一块看,把原来的电脑拿出来放中间看视频用 --- 以后会有的课程 难度 深入Java 8 难度1 并发与netty 难度3 JVM 难度4 ...

  6. SQL Server 2016 CTP2.2 的关键特性

    SQL Server 2016 CTP2.2 的关键特性 正如微软CEO 说的,SQL Server2016 是一个Breakthrough Flagship  Database(突破性的旗舰级数据库 ...

  7. 【集合框架】JDK1.8源码分析之TreeMap(五)

    一.前言 当我们需要把插入的元素进行排序的时候,就是时候考虑TreeMap了,从名字上来看,TreeMap肯定是和树是脱不了干系的,它是一个排序了的Map,下面我们来着重分析其源码,理解其底层如何实现 ...

  8. Java之TreeMap

    基本特性: 基于红黑树. 非线程安全. 同步使用: SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...))

  9. HashMap,LinkedHashMap,TreeMap的区别

    Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复. Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很 ...

随机推荐

  1. audit的日志

    audit审计, audio 声音, 音频 audit的日志, 有两个可能的地方: 一是, /var/log/messages 文件中 二是, 如果开启了audit服务, 则 在/var/log/au ...

  2. python使用__new__创建一个单例模式(单例对象)

    #单例模式:使一个类只产生一个对象.他们的id地址都指向同一个内存地址 第一步:理解谁创建了对象 # 单例模式# 首先明白,我们在创建一个类的对象的时候,其实是调用的这个类的父类,即继承object, ...

  3. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_4_Map集合遍历键找值方式

    键找值的方式 增强for 增强for的简化方式

  4. Nginx-Lua模块的执行顺序(转)

    一.nginx执行步骤 nginx在处理每一个用户请求时,都是按照若干个不同的阶段依次处理的,与配置文件上的顺序没有关系,详细内容可以阅读<深入理解nginx:模块开发与架构解析>这本书, ...

  5. 把数据库中的数据制作成Excel数据

    把数据库中的数据制作成Excel数据 如果我们在使用Excel的时候,需要把数据库中的数据制作成Excel数据透视表,我们该怎么操作呢?如果数据在数据库中,我们不用把数据导入到工作表中,我们可以直接以 ...

  6. Nginx主要功能及使用

    Nginx配置详解   序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭借开源的力量,已经接近成熟与完善. Nginx功能丰富, ...

  7. [2019杭电多校第七场][hdu6655]Just Repeat

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6655 题意是说两个人都有一些带有颜色的牌,两人轮流出牌,但是不能出对面出过的颜色的牌,最后谁不能出牌谁 ...

  8. Mysql共享锁、排他锁、悲观锁、乐观锁

    一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |--排他锁(X锁,MyISAM 叫做写锁) |--间隙锁( ...

  9. 3183 RMQ / 贪心(坑成。。)

    题意:删去m个数,使剩下的数组成的数最小 题解 :贪心 , RMQ RMQ解法,建st表找,用rmq找最小值的下标,注意点 ,因为最小值是区间最右最小值,所以应该改成 <= 而不是< mi ...

  10. LeetCode103. 二叉树的锯齿形层次遍历

    103. 二叉树的锯齿形层次遍历 描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 示例 例如,给定二叉树: [3,9,2 ...