【数据结构】TreeMap和TreeSet

目录

1、TreeMap

1.1 TreeMap 的简介 

1.2 TreeMap 的基本使用

2、TreeSet

2.1 TreeSet 的简介 

2.2 TreeSet 的基本操作 


1、TreeMap

1.1 TreeMap 的简介 

  • TreeMap 的底层是一棵搜索树,这颗搜索树其实是红黑树
  • TreeMap 因为实现了 SortedMap 接口,所以往里放元素的时候 key 必须是可比较的,否则就会报错

  • TreeMap 关于 key 是有序的

假设目前我们有这样的代码:

public static void main(String[] args) {
    Map<Integer,Integer> map = new TreeMap<>();
    map.put(3,2);
    map.put(1,3);
    System.out.println(map);
}

打印结果:

通过打印结果我们也可以看出TreeMap是关于key有序的

1.2 TreeMap 的基本使用

import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class Test {
    public static void main(String[] args) {
        Map<String,Integer> map = new TreeMap<>();
        //插入操作
        map.put("a",2);
        map.put("c",3);
        map.put("b",1);
        //获取 key 对应的下标
        int index = map.get("a");
        System.out.println(index);
        //如果 key 不存在,就返回默认值
        int num = map.getOrDefault("e",100);
        System.out.println(num);
        //删除操作
        int del = map.remove("a");
        System.out.println(del);
        //判断是否包含 key
        System.out.println(map.containsKey("a"));
        //判断是否包含 value
        System.out.println(map.containsValue(1));
        //返回所有 key-value 映射关系
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        for (Map.Entry<String,Integer> entry : entrySet) {
            System.out.println("key:" + entry.getKey() + " value:" + entry.getValue());
        }
    }
}

2、TreeSet

2.1 TreeSet 的简介 

TreeSet 使用的模型是纯 key 模型,添加的 key 不能够重复,且关于 key 有序 

TreeMap 具有的特性 TreeSet 同样具有,唯一不同的就是 TreeMap 使用的模型是 key-value 键值对,而TreeSet 使用的是纯 key 模型。TreeMap 具有的特性 TreeSet 同样具有,主要原因就是因为 TreeSet 的底层就是 TreeMap

TreeSet 存储的 key 要求有序,原因就是 TreeMap 的 key 也是有序性的 

证明 TreeSet 的底层就是 TreeMap:

我们可以查看 TreeSet 的 add 方法的源码,来看数据是存储在哪的

 通过上述的 TreeSet 的 add 方法的源码,可以看出每次进行 add 添加元素的时候都是往 m 这个对象中进行 put 插入操作

其实通过上述调用 m.put 方法后面的参数也就基本上可以猜出,是往 TreeMap 集合对象中进行存储数据,第一个参数就是 key,第二个操作就是 value,这个 value 其实是Object 的一个默认值

上述说通过参数可以猜出是往 TreeMap 对象中插入元素,那我们接下来就通过源码来进行证明

那我们就来看一下 TreeSet 的构造方法:

 当我们实例化一个 TreeSet 类的时候,假设没参数就会通过 this 调用别的构造方法,并且实例化一个 TreeMap 传过去 

 传过来的 TreeMap 实例化被 m 接收,把这个 m 赋值给了 TreeSet 对象中的 m

上述的证明已足够证明 TreeSet 的底层就是 TreeMap 

2.2 TreeSet 的基本操作 

import java.util.Iterator;
import java.util.TreeSet;

public class TreeSetTest {
    public static void main(String[] args) {
        TreeSet<Integer> treeSet = new TreeSet<>();
        //添加元素
        treeSet.add(1);
        treeSet.add(3);
        treeSet.add(2);
        //判断 1 是否在集合中
        System.out.println(treeSet.contains(1));
        //删除集合中的 1
        System.out.println(treeSet.remove(1));
        //返回元素的个数
        System.out.println(treeSet.size());
        //判断集合是否为空
        System.out.println(treeSet.isEmpty());
    }
}

猜你喜欢

转载自blog.csdn.net/m0_66488562/article/details/128660018