TreeMap 和 TreeSet
TreeMap 和 TreeSet
概述
- TreeSet集合底层实际上是一个TreeMap
- TreeMap集合底层是一个二叉树
- 放到TreeSet集合中的元素,等同于放到TreeMap集合的key部分
- TreeSet集合中的元素: 无序不可重复, 但是可以根据元素的大小自动排序, 称为: 可排序集合
- TreeSet/TreeMap集合是自平衡二叉树,遵循左小右大的存放原则,存的时候是要进行比较的
- 放在TreeSet中的元素需要实现 java.lang.Comparable 接口, 并且实现compareTo 方法,equals方法可以不用重写
- 除了实现 java.lang.Comparable 接口,还可以在创建TreeSet集合时,传入比较器,比较器需实现java.util.Comparator接口,并实现里面的compare方法
- 如果即实现了java.lang.Comparable 接口 ,也传入比较器,根据的是比较器的规则
二叉树
static final class Entry<K,V> implements Map.Entry<K,V> {
K key;
V value;
Entry<K,V> left; //左节点内存地址
Entry<K,V> right; //右节点内存地址
Entry<K,V> parent; //父节点内存地址
boolean color = BLACK;
}
-
二叉树的三种遍历方式:
- 前序遍历 : 根左右
- 中序遍历 : 左根右
- 后序遍历 : 左右根
-
注意 : 前中后说的是 "根" 的位置, 根在前面是前序, 根在中间是中序 , 根在后面是后序
-
TreeSet/TreeMap集合采用的是 : 中序遍历方式
-
100 200 50 60 80 120 140 130 135 180 666 45 55
![]()
45 50 55 60 80 100 120 130 135 140 180 200 666
public class TreeMapTest {
public static void main(String[] args) {
/** 1. TreeSet集合底层实际上是一个TreeMap
* 2. TreeMap集合底层是一个二叉树
* 3. 放到TreeSet集合中的元素,等同于放到TreeMap集合的key部分
* 4. TreeSet集合中的元素: 无序不可重复, 但是可以根据元素的大小自动排序, 称为: 可排序集合
*/
TreeSet<String> treeSet = new TreeSet<>();
treeSet.add("jqc1");
treeSet.add("jqc2");
treeSet.add("jqc4");
treeSet.add("jqc3");
treeSet.add("jqc1");
for (String s : treeSet) {
System.out.println(s);
}
//Pig类实现java.lang.Comparable接口
TreeSet<Pig> pigs = new TreeSet<>();
pigs.add(new Pig(100));
pigs.add(new Pig(200));
pigs.add(new Pig(100));
pigs.add(new Pig(500));
pigs.add(new Pig(150));
for (Pig pig : pigs) {
System.out.println(pig);//Pig{age=100} Pig{age=150} Pig{age=200} Pig{age=500}
}
//在创建TreeSet集合时,传入比较器
TreeSet<Cat> cats = new TreeSet<>(new MyComparetor());
cats.add(new Cat(100));
cats.add(new Cat(50));
cats.add(new Cat(70));
cats.add(new Cat(50));
for (Cat cat : cats) {
System.out.println(cat);//Cat{age=50} Cat{age=70} Cat{age=100}
}
};
}
class Pig implements Comparable<Pig>{
Integer age;
public Pig(Integer age) {
this.age = age;
}
@Override
public int compareTo(Pig o) {
return this.age - o.age;
}
@Override
public String toString() {
return "Pig{" +
"age=" + age +
'}';
}
}
class Cat {
Integer age;
public Cat(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Cat{" +
"age=" + age +
'}';
}
}
class MyComparetor implements Comparator<Cat>{
@Override
public int compare(Cat o1, Cat o2) {
return o1.age - o2.age;
}
}
我成功因为我志在成功

浙公网安备 33010602011771号