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()