最近心血来潮,决定好好研究一下java的集合框架:
于是有了如下代码,看起来有点乱,但是写的过程中还摸清楚了很多问题。
1、 TreeMap的底层实现原理,基于红黑树的,有序。
2、默认采用升序,根据entry(key,value)中的key来确定先后顺序,假如你传入的key是int类型的,那么key越大,对应的entry越靠后。
3、存放进TreeMap的每一个元素是entry,要求key的类型一致,如果不一致会报错的。
4、采用红黑树有什么好处呢?红黑树是一种平衡树,查找的性能是介于数组和链表之间。
package com.miller.datastructure.precious;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeMap;
/**
* @program: data-structure
* @description: test
* @author: Miller.FAN
* @create: 2019-09-26 13:40
**/
public class TreeMapTest {
public static void main(String[] args) {
TreeMap treeMap = new TreeMap();
//底层实现原理,红黑树 默认升序,且根据key的顺序
treeMap.put(1,5);
treeMap.put(2,8);
treeMap.put(3,1);
treeMap.put(5,9);
treeMap.put(4,6);
//如果key相同覆盖前value
//treeMap.put(3,9);
//key 的类型不统一会抛出异常
//treeMap.put("full","sum");
System.out.println("输出value数组: " + treeMap.values());
Object value = treeMap.get(3);
System.out.println("查找结果: " + value);
//test2 new 时传入一个Comparator
TreeMap treeMap1 = new TreeMap(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 < o2 ? 1:-1;
}
});
treeMap1.put(1,3);
treeMap1.put(2,4);
treeMap1.put(4,1);
treeMap1.put(3,8);
System.out.println("treeMap1输出value数组: " + treeMap1.values());
//传入比较器时,要考虑以哪一个值作为返回值比较好
TreeMap treeMap3 = new TreeMap(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int number = o1.getAge() - o2.getAge();
return 0 < number ? 1:-1;
}
});
//事实证明这个比较器关注的重点应该放在即将放入TreeMap中的entry的KEY是,对KEY类型做比较处理
TreeMap treeMap2 = new TreeMap(
new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 < o2 ? 1:-1;
}
}
);
Student student1 = new Student(1,"fengzhenbiao", 32);
Student student2 = new Student(2,"boluo",31);
Student student3 = new Student(3,"miller",15);
treeMap2.put(student1.getAge(),student1);
treeMap2.put(student2.getAge(),student2);
treeMap2.put(student3.getAge(),student3);
Iterator<Student> it = treeMap2.entrySet().iterator();
while(it.hasNext()) {
Object s = it.next();
System.out.println("打印entity:" + s.toString());
}
//那么实体类能不能做KEY呢?
TreeMap treeMap_entity = new TreeMap(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return 0 > (o1.hashCode() - o2.hashCode()) ? 1:-1;
}
});
Student u1 = new Student(5,"bule",67);
Student u2 = new Student(6,"red",45);
Student u3 = new Student(3,"black",32);
treeMap_entity.put(u1,1);
treeMap_entity.put(u2,3);
treeMap_entity.put(u3,2);
Iterator<Student> its = treeMap_entity.entrySet().iterator();
while(its.hasNext()) {
Object s = its.next();
System.out.println("打印####:" + s.toString());
}
}
}