Java:TreeMap集合探究
Posted 流楚丶格念
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java:TreeMap集合探究相关的知识,希望对你有一定的参考价值。
文章目录
1.TreeMap集合
1.1 TreeMap集合概述和特点
- TreeMap底层是红黑树结构, 这种实现提供保证
log(n)
的时间成本的containsKey,get,put和remove操作 - 依赖自然排序或者比较器排序,对键进行排序
- 如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时候给出比较器排序规则
TreeMap继承关系
2. TreeMap综合案例
2.1 案例一:按照年龄(姓名)进行排序并遍历
代码需求:创建一个TreeMap集合,键是学生对象(Student),值是籍贯(String),学生属性姓名和年龄,按照年龄进行排序并遍历,要求按照学生的年龄进行排序,如果年龄相同则按照姓名进行排序
2.1.1 代码实现
排序小技巧:
- o1,o2:o1在前升序,o2在前降序
- this,o:this在前升序,this在后降序。
package com.test;
import java.util.*;
class Student implements Comparable<Student>
private String name;
private int age;
public Student()
public Student(String name, int age)
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 "Student" +
"name='" + name + '\\'' +
", age=" + age +
'';
@Override
public int compareTo(Student o)
//按照年龄进行排序 要比的o与当前对象 比的要大 放前面 先按照年龄降序 再按照名字降序
int result = o.getAge() - this.getAge();
//次要条件,按照姓名排序。
return result == 0 ? o.getName().compareTo(this.getName()) : result;
public class TreeMapTest
public static void main(String[] args)
// 创建TreeMap集合对象
TreeMap<Student,String> tm = new TreeMap<>();
// 创建学生对象
Student s1 = new Student("苏映雪",11);
Student s2 = new Student("叶轻柔",22);
Student s3 = new Student("莫妮倩",33);
// 将学生对象添加到TreeMap集合中
tm.put(s1,"太灵");
tm.put(s2,"月兰");
tm.put(s3,"天机");
// 遍历TreeMap集合,打印每个学生的信息
tm.forEach(
(Student key, String value)->
System.out.println(key + "---" + value);
);
2.2 案例二:统计字符串中每个字符出现的次数
案例需求:给定一个字符串,要求统计字符串中每个字符出现的次数。
举例: 给定字符串是“aababcabcdabcde”,在控制台输出: “a(5)b(4)c(3)d(2)e(1)”
2.2.1 代码实现
package com.test;
import java.util.*;
public class TreeMapTest2
public static void main(String[] args)
// 给定字符串
String s = "aababcabcdabcde";
// 创建TreeMap集合对象,键是Character,值是Integer
TreeMap<Character,Integer> tm = new TreeMap<>();
TreeMap<Character,Integer> treeMap = new TreeMap<>();
// 遍历字符串:简写
for (int i = 0; i < s.length(); i++)
char c=s.charAt(i);
treeMap.put(c,treeMap.getOrDefault(c,0)+1);
//遍历字符串,得到每一个字符
// for (int i = 0; i < s.length(); i++)
// //c依次表示字符串中的每一个字符
// char c = s.charAt(i);
// // 判断当前遍历到的字符是否在集合中出现过
// if(!tm.containsKey(c))
// //表示当前字符是第一次出现。
// tm.put(c,1);
// else
// //存在,表示当前字符已经出现过了
// //先获取这个字符已经出现的次数
// Integer count = tm.get(c);
// //自增,表示这个字符又出现了依次
// count++;
// //将自增后的结果再次添加到集合中。
// tm.put(c,count);
//
//
// a(5)b(4)c(3)d(2)e(1)
//System.out.println(tm);
treeMap.forEach(
(Character key,Integer value)->
System.out.print(key + "(" + value + ")");
);
运行结果如下:
3. TreeMap和HashMap的关联与区别
二者都实现的是Map,Map是通过对象来对 对象进行索引的,用来索引的对象叫键key,其对应的对象叫值value;
1、HashMap是通过hashcode()对其内容进行快速查找的;HashMap中的元素是没有顺序的;
TreeMap中所有的元素都是有某一固定顺序的,如果需要得到一个有序的结果,就应该使用TreeMap;
2、HashMap和TreeMap都不是线程安全的;
3、HashMap继承AbstractMap类;覆盖了hashcode() 和equals() 方法,以确保两个相等的映射返回相同的哈希值;
TreeMap继承SortedMap类;他保持键的有序顺序;
4、HashMap:基于hash表实现的;使用HashMap要求添加的键类明确定义了hashcode() 和equals() (可以重写该方法);为了优化HashMap的空间使用,可以调优初始容量和负载因子;
TreeMap:基于红黑树实现的;TreeMap就没有调优选项,因为红黑树总是处于平衡的状态;
5、HashMap:适用于Map插入,删除,定位元素;
TreeMap:适用于按自然顺序或自定义顺序遍历键(key);
以上是关于Java:TreeMap集合探究的主要内容,如果未能解决你的问题,请参考以下文章
集合-Java中Arrays.sort()自定义数组的升序和降序排序