1.TreeSet和TreeMap简介
a.继承图
TreeSet的继承图如下:
TreeSet实现了SortedSet接口
SortedSet接口继承了Set接口
Set接口继承了Collection接口
TreeMap继承图如下:
TreeMap实现了SortedMap接口
SortedMap接口实现了Map接口
b.特点
由于TreeSet底层是用TreeMap实现的,所以两者的很多特点都相同,如下表:
底层数据结构 | 红黑树 |
---|---|
是否有序 | 关于key有序 |
元素是否重复 | 不重复 |
线程安全 | 不安全 |
比较方式 | 实现Comparable接口或者提供比较器 |
2.常用方法
TreeSet常用的方法也就是Set接口里那几个常用方法:
方法 | 说明 |
---|---|
boolean add(E e) | 如果元素不存在,添加元素到set集合中 |
boolean remove(Object o) | 如果元素存在,删除此元素 |
boolean contains(Object o ) | 如果set集合包含这个元素,返回true |
boolean isEmpty() | 如果set集合中没有元素,返回true |
void clear | 删除set集合中的所有元素 |
Iterator iterator() | 返回set集合的迭代器 |
int size() | 返回set集合的元素个数 |
下面的代码简单测试一下这些方法:
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
Set<String> treeSet = new TreeSet<>();
//添加元素 "jack" "john" "小明"
treeSet.add("jack");
treeSet.add("john");
treeSet.add("小明");
//删除元素 "jack"
treeSet.remove("jack");
//是否包含元素 "john"
boolean contain = treeSet.contains("john");
System.out.println("是否包含元素john: " + contain);
//集合是否为null
boolean empty = treeSet.isEmpty();
System.out.println("集合是否为空: " + empty);
//得到元素个数
int size = treeSet.size();
System.out.println("元素个数: " + size);
//得到迭代器
System.out.print("集合里面的元素:");
Iterator<String> iterator = treeSet.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
//删除所有元素
treeSet.clear();
}
}
输出:
是否包含元素john: true
集合是否为空: false
元素个数: 2
集合里面的元素:john 小明
使用TreeSet去重示例:
在这个例子中,数据为:{1, 2, 2, 8, 9, 11, 33}
创建一个TreeSet集合,把每个元素添加进去,就完成了去重操作。
set集合里面的数据为:{1, 2, 8, 9, 11, 33}
import java.util.Set;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
int[] arr = {1, 2, 2, 8, 9, 11, 33};
Set<Integer> treeSet = new TreeSet<>();
//去重前, 打印
System.out.println("去重前:");
for (int val : arr) {
System.out.print(val + " ");
}
System.out.println();
//去重
for (int val : arr) {
treeSet.add(val);
}
//去重后, 打印
System.out.println("去重后:");
for (int val : treeSet) {
System.out.print(val + " ");
}
System.out.println();
}
}
输出
去重前:
1 2 2 8 9 11 33
去重后:
1 2 8 9 11 33
Map接口下的内部接口和常用方法:
内部接口 | 说明 |
---|---|
static interface Map.Entry<K,V> | 获取键值对的接口 |
方法 | 说明 |
---|---|
V put(K key, V value) | 将key和value作为键值对,添加到Map中 |
V get(Object key) | 返回key对应的value |
V getOrDefault(Object key, V defaultValue) | 如果Map中有关于key对应的value 则返回Map中的value, 否则返回默认的value |
boolean containsKey(Object key) | 如果Map中有key则返回true |
Set<Map.Entry<K,V>> entrySet() | 返回一个set集合,里面的元素是Map.Entry<K, V> |
Map.Entry<K, V>接口里获取key和value的方法
方法 | 说明 |
---|---|
K getKey() | 获取key |
V getValue() | 获取value |
TreeMap常用方法测试:
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class MapTest {
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<>();
//使用put方法,把键值对放进map中
//这里第一个参数是人名,第二个参数是年龄
map.put("小红", 18);
map.put("小明", 22);
map.put("李华", 21);
//获取"小红"对应的年龄
Integer age = map.get("小红");
System.out.println(age);
//查看map里是否有"李华"
boolean ret = map.containsKey("李华");
System.out.println("是否有李华->" + ret);
//得到Entry的set集合,遍历set集合
//获取Entry对象,然后获取key和value
Set<Map.Entry<String, Integer>> entries = map.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
System.out.print("key = " + entry.getKey() + "\t");
System.out.print("value = " + entry.getValue());
System.out.println();
}
}
}
输出:
age-> 18
是否有李华->true
key = 小明 value = 22
key = 小红 value = 18
key = 李华 value = 21