TreeMap的简单分析

62 阅读3分钟

与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进行排序。 image.png

通过两段小代码,可以总结出,TreeMap它的特点是唯一和有序,而它放入集合的key数据对应的类型内部一定要实现比较器(内部比较器和外部比较器都可以),这也和他的底层原理是红黑树有关系