TreeMap和TreeSet

1.java类集合的关系

TreeMap和TreeSet是Map和Set的实现子类.

TreeMap和TreeSet即Java中利用搜索树实现的Map和Set 实际上底层用的是红黑树

1.1概念及场景

Map和set是一种专门用来进行搜索的容器或者数据结构,而TreeMap和TreeSet是实现了SortedMap/SortedSet接口的实现子类,能够使集合内的元素有序存放起来.

1.2 模型

一般把搜索的数据成为关键字(key),和关键字对应的称为值(value) ,将其称之为Key-Value 的键值对,所以模型会有两种,一种是Key模型,另一种是Key-Value键值对模型,

对于TreeSet集合 它就是一种Key模型,对于TreeMap来说,它就是一种Key-Value模型.(实际上,TreeSet的底层就是创建了一个TreeMap对象,key对应存放的值,而Value是固定的Object对象 并不能更改, 因此就成为了纯Key模型)**

2.Map的使用

2.1对Map的说明
  • Map是一个接口类,该类没有继承Collection,该类中该存储的<K,V>结构的键值对,而且K一定是唯一 且不能重复的 如果提供了同一个Key而不同的Value,相当于给Value更新值.

Map的官方文档

2.2 Map.Entry<K,V>常见方法

Map.Entry<K,V> 是Map内部实现的用来存放key ,value映射关系的内部类,该类中提供了,key ,value的获取,value的设置以及key的比较方式.

在Map的实现类TreeMap里面存在着Entry内部类来实现Map.Entry<K,V>

方法

解释

K getKey()

返回 entry 中的 key

V getValue()

返回 entry 中的 value

V setValue(V value)

将键值对中的value替换为指定value

TreeMap没有提供setKey方法的原因是因为如果改动了key,可能会对查找其他key产生影响

2.3Map 的常用方法说明

方法

解释

V get(Object key)

返回 key 对应的 value

V getOrDefault(Object key, V defaultValue)

返回 key 对应的 value,key 不存在,返回默认值

V put(K key, V value)

设置 key 对应的 value

V remove(Object key)

删除 key 对应的映射关系

Set keySet()

返回所有 key 的不重复集合

Collection values()

返回所有 value 的可重复集合

Set<Map.Entry<K, V>> entrySet()

返回所有的 key-value 映射关系

boolean containsKey(Object key)

判断是否包含 key

boolean containsValue(Object value)

判断是否包含 value z

注意:

  1. Map是一个接口,不能实例化对象,如果要实例化需要实例化其实现列TreeMap或者HashMap

  1. Map中存放键值对的Key是唯一的,Value是可以重复的

  1. 在TreeMap插入键值对时,key不能为null,否则或抛出NullPointerException异常,value可以为空,因为key是唯一的,value值可以重复如果没有了key就无法搜索对应的value值.

  1. Map中的key可以全部分离出来,储存到Set中来访问(因为key不能重复);

  1. 如果TreeMap实现排序,那么存放的对象如果是引用类型那么就必须要实现Comparable或者Comparator接口如果没有实现就会报错,因为无法比较两个对象的大小.

  1. Map的value值可以分离在Collection里的任何一个子集 (因为Value可以重复)

2.4 TreeMap的使用案例
  • TreeMap.put(K key,V value);

如果放入的对象没有比较器那么就会报错

定义一个Student类(没有实现比较)

class Student {
    public int id;
    public String name;

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

将Student 放进 TreeMap里面

public static void main(String[] args) {
        TreeMap<Student, String> map = new TreeMap<>();
        //会发生报错
        map.put(new Student(1,"张三"),"翻斗花园");
        map.put(new Student(2,"李四"),"花果山");
        map.put(new Student(3,"王五"),"翻斗花园");
    }

会报类型转换异常,原因就是因为Student没有实现比较器,而TreeMap的key必须是可以比较的,因此会报错.

因此我们让Student实现Comparable接口

class Student implements Comparable<Student>{
    public int id;
    public String name;

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        if(this.id == o.id){
            return o.name.compareTo(o.name);
        }
        return this.id - o.id;
    }
}
  • Treemap.get(K key);

  • 用Map.Entry遍历集合

  • TreeMap.remove(K ket);

3.Set的说明

Set 的官方文档

Set与Map主要的不同有两点:Set是继承自Collection的接口类,Set中只存储了Key。

方法

解释

boolean add(E e)

添加元素,但重复元素不会被添加成功

void clear()

清空集合

boolean contains(Object o)

判断 o 是否在集合中

Iterator iterator()

返回迭代器

boolean remove(Object o)

删除集合中的 o

int size()

返回set中元素的个数

boolean isEmpty()

检测set是否为空,空返回true,否则返回false

Object[] toArray()

将set中的元素转换为数组返回

boolean containsAll(Collection<?> c)

集合c中的元素是否在set中全部存在,是返回true,否则返回 false

boolean addAll(Collection<? extends E> c)

将集合c中的元素添加到set中,可以达到去重的效果

注意:

  1. Set是继承自Collection的一个接口类

  1. Set中只存储了key,并且要求key一定要唯一

  1. TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的

  1. Set最大的功能就是对集合中的元素进行去重

  1. 实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础 上维护了一个双向链表来记录元素的插入次序。

  1. Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入TreeSet中不能插入null的key,HashSet可以

TreeSet本质上使用的TreeMap,键值对关系转为了纯key关系(因为Value被一个常量对象所代替)

在源码中:

// Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();
3.1 TreeSet的使用案例

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值