1.TreeMap存储是存在顺序的(字典序),原因是put方法中使用了compare方法,如果在构造treeMap对象时不传入一个comparator,那么就会将对象转型了Comparable;
比如:TreeMap中存储的key是字符串的类型,并且构造TreeMap对象时不制定比较器,那么就会使用String包装类实现的Comparable接口,并且其中的比较器就是字典序排序;
package com.ydlclass.collection;
import java.util.*;
public class TreeMapTest {
public static void main(String[] args) {
Map<String, Integer> linkHMap = new TreeMap<>();//此时使用LRU时linkedHashMap中只能存储固定的长度;
//此处也可以传入一个比较器
//Map<Integer,Integer> linkMap = new TreeMap<>(new Comparator<Integer>() {
// @Override
// public int compare(Integer o1, Integer o2) {
// return o1 - o2;
// }
//});
linkHMap.put("a", 1);
linkHMap.put("b", 2);
linkHMap.put("e", 3);
linkHMap.put("c", 4);
linkHMap.put("i", 5);
linkHMap.put("f", 6);
linkHMap.put("g", 7);
linkHMap.put("fg", 8);
linkHMap.put("gh", 9);
linkHMap.get("g");
Set<Map.Entry<String, Integer>> entries = linkHMap.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
for (; iterator.hasNext(); ) {
Map.Entry<String, Integer> next = iterator.next();
System.out.println(next.getKey() + " = " + next.getValue().toString());
}
}
}
2.可以自定义比较的策略实现不同的比较方式;(倒序,或者是顺序排序)
3.自定义的类比如一个学生类,并且作为键来存储需要注意的事项;
User类实现comparable接口,需要实现compareTo方法;如果不实现这个接口,这个类会报错:User cannot be cast to class java.lang.Comparable (com.ydlclass.collection.User is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')
package com.ydlclass.collection;
public class User implements Comparable<User>{
private String name;
private Integer age;
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
//@Override
//public int compareTo(User o) {
// return this.age - o.age;
//}
@Override
public int compareTo(User o) {
return o.age - this.age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
2.TreeMapTest
package com.ydlclass.collection;
import java.util.*;
public class TreeMapTest {
public static void main(String[] args) {
Map<User, Integer> linkHMap = new TreeMap<>();//此时使用LRU时linkedHashMap中只能存储固定的长度;
linkHMap.put(new User("zhangsan",1),10);
linkHMap.put(new User("zhangsan1",3),12);
linkHMap.put(new User("zhangsan2",2),13);
linkHMap.put(new User("zhangsan3",8),11);
Set<User> users = linkHMap.keySet();
Iterator<User> iterator = users.iterator();
for (;iterator.hasNext();){
User next = iterator.next();
System.out.println(next.toString() + " = " + linkHMap.get(next));
}
}
}
4.为了实现TreeMap,User类可以像上面实现Comparable接口。也可以使用第二种方式,例如构造TreeMap的时候传入一个比较的策略;(可以回顾之前策略设计模式时设计的比较策略)或者使用自带的java.util的直接new comparator()