赞
踩
TreeMap和TreeSet是Map和Set的实现子类.
TreeMap和TreeSet即Java中利用搜索树实现的Map和Set 实际上底层用的是红黑树
Map和set是一种专门用来进行搜索的容器或者数据结构,而TreeMap和TreeSet是实现了SortedMap/SortedSet接口的实现子类,能够使集合内的元素有序存放起来.
一般把搜索的数据成为关键字(key),和关键字对应的称为值(value) ,将其称之为Key-Value 的键值对,所以模型会有两种,一种是Key模型,另一种是Key-Value键值对模型,
对于TreeSet集合 它就是一种Key模型,对于TreeMap来说,它就是一种Key-Value模型.(实际上,TreeSet的底层就是创建了一个TreeMap对象,key对应存放的值,而Value是固定的Object对象 并不能更改, 因此就成为了纯Key模型)**
Map是一个接口类,该类没有继承Collection,该类中该存储的<K,V>结构的键值对,而且K一定是唯一 且不能重复的 如果提供了同一个Key而不同的Value,相当于给Value更新值.
Map.Entry<K,V> 是Map内部实现的用来存放key ,value映射关系的内部类,该类中提供了,key ,value的获取,value的设置以及key的比较方式.
在Map的实现类TreeMap里面存在着Entry内部类来实现Map.Entry<K,V>
TreeMap没有提供setKey方法的原因是因为如果改动了key,可能会对查找其他key产生影响
方法 | 解释 |
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 |
注意:
Map是一个接口,不能实例化对象,如果要实例化需要实例化其实现列TreeMap或者HashMap
Map中存放键值对的Key是唯一的,Value是可以重复的
在TreeMap插入键值对时,key不能为null,否则或抛出NullPointerException异常,value可以为空,因为key是唯一的,value值可以重复如果没有了key就无法搜索对应的value值.
Map中的key可以全部分离出来,储存到Set中来访问(因为key不能重复);
如果TreeMap实现排序,那么存放的对象如果是引用类型那么就必须要实现Comparable或者Comparator接口如果没有实现就会报错,因为无法比较两个对象的大小.
Map的value值可以分离在Collection里的任何一个子集 (因为Value可以重复)
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);
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中,可以达到去重的效果 |
注意:
Set是继承自Collection的一个接口类
Set中只存储了key,并且要求key一定要唯一
TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的
Set最大的功能就是对集合中的元素进行去重
实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础 上维护了一个双向链表来记录元素的插入次序。
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();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。