与HashMap相比,TreeMap是一个能比较元素大小的Map集合,会对传入的key进行了大小排序。其中,可以使用元素的自然顺序,也可以使用集合中自定义的比较器来进行排序;
下面我们通过几个小demo来了解TreeMap
package JiHeList.shu;
import java.util.Map;
import java.util.TreeMap;
/**
* @program: src
* @description: treemap的学习
* key的类型为String类型
* @author: SongZhiZe
* @create: 2022-09-14 00:02
**/
public class Test02 {
/** 这是main方法,程序入口*/
public static void main(String[] args) {
Map<String,Integer> map = new TreeMap<>();
map.put("blili",1234);
map.put("alibi",2345);
map.put("daily",3456);
map.put("clili",4567);
map.put("blili",5678);
System.out.println(map.size());
System.out.println(map);
}
}
输出结果
4 {alibi=2345, blili=5678, clili=4567, daily=3456}
代码分析 通过key的类型为string类型的demo,我们可以分析得出,存入TreeMap的值也是唯一的,并且其输出结果经过了一定的排序,紧接着我们通过key的类型为自定义的引用变量来判断一下这条结论是否成立。
下面代码中含有内部比较器,可以选择性的对比较不同的值进行排序```language
```java
package JiHeList.shu;
/**
* @program: src
* @description:
* TreeMap的学习
* key的类型为自定义引用数据类型
* @author: SongZhiZe
* @create: 2022-09-14 00:12
**/
public class StudentShu implements Comparable<StudentShu>{
/** 添加内部比较器 */
private int age;
private String name;
private double height;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public StudentShu(int age, String name, double height) {
this.age = age;
this.name = name;
this.height = height;
}
@Override
public String toString() {
return "StudentShu{" +
"age=" + age +
", name='" + name + '\'' +
", height=" + height +
'}';
}
@Override
public int compareTo(StudentShu o) {
// 此处按照年龄进行排序
return this.getAge()-o.getAge();
// 按照名字进行排序
// return this.getName().compareTo(o.getName());
}
}
package JiHeList.shu;
import java.util.Map;
import java.util.TreeMap;
/**
* @program: src
* @description:
* @author: SongZhiZe
* @create: 2022-09-14 00:17
**/
public class Test03 {
public static void main(String[] args) {
Map<StudentShu,Integer> map = new TreeMap<>();
// 外部比较器
/** Map<StudentShu,Integer> map = new TreeMap<>(new Comparator<StudentShu>() {
@Override
public int compare(StudentShu o1, StudentShu o2) {
// 按照身高进行比较
return ((Double)(o1.getHeight())).compareTo(((Double)(o2.getHeight())));
}
});*/
map.put(new StudentShu(18,"老王",180),1001);
map.put(new StudentShu(13,"小王",140),1021);
map.put(new StudentShu(17,"老王",150),1031);
map.put(new StudentShu(19,"劳王",160),1041);
map.put(new StudentShu(14,"牢王",190),1401);
System.out.println(map);
System.out.println(map.size());
}
}
输出结果
{StudentShu{age=13, name='小王', height=140.0}=1021, StudentShu{age=14, name='牢王', height=190.0}=1401, StudentShu{age=17, name='老王', height=150.0}=1031, StudentShu{age=18, name='老王', height=180.0}=1001, StudentShu{age=19, name='劳王', height=160.0}=1041} 5
此时此刻我们依然在使用内部比较器进行比较,比较的规则是按照年龄从小到大进行排序
不难发现我们下面图片中的代码使用的是外部比较器,与内部比较器相同的是,都可以对TreeMap进行排序。
通过两段小代码,可以总结出,TreeMap它的特点是唯一和有序,而它放入集合的key数据对应的类型内部一定要实现比较器(内部比较器和外部比较器都可以),这也和他的底层原理是红黑树有关系