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更新值.

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

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

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

方法解释
getKey()返回 entry 中的 key
getKey()返回 entry 中的 value
V setValue(V value)将键值对中的value替换为指定value

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

2.3Map 的常用方法说明

方法解释
get(Object key)返回 key 对应的 value
getOrDefault(Object key, V defaultValue)返回 key 对应的 value,key 不存在,返回默认值
put(K key, V value)设置 key 对应的 value
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

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

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

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

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

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

2.4 TreeMap的使用案例

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

定义一个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,"张三"),"112");
        map.put(new Student(2,"李四"),"223");
        map.put(new Student(3,"王五"),"334");
    }

会报类型转换异常,原因就是因为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;
    }
}

3.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的一个接口类

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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值