HashMap不保证数据有序
LinkedHashMap保证数据插入有序,
要保证map的key可以大小排序,使用TreeMap集合
使用红黑树实现key按大小排序。
红黑树是一颗自平衡的排序二叉树。是一个有着着色性质的二叉查找树:
- 每一个节点为黑色或红色
- 根节点是黑色的
- 如果一个节点是红色的,那么它的子节点是黑色的
- 从一个节点到一个Null引用的每一条路径(如果有多条的话),必须包含相同数目的黑色节点。
TreeMap数据结构
定义
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable
TreeMap中同时也包含了如下几个重要的属性:
//比较器,因为TreeMap是有序的,通过comparator接口我们可以对TreeMap的内部排序进行精密的控制
private final Comparator<? super K> comparator;
//TreeMap红-黑节点,为TreeMap的内部类
private transient Entry<K,V> root = null;
//容器大小
private transient int size = 0;
//TreeMap修改次数
private transient int modCount = 0;
//红黑树的节点颜色--红色
private static final boolean RED = false;
//红黑树的节点颜色--黑色
private static final boolean BLACK = true;
Entry是TreeMap的内部类
//键
K key;
//值
V value;
//左孩子
Entry<K,V> left = null;
//右孩子
Entry<K,V> right = null;
//父亲
Entry<K,V> parent;
//颜色
boolean color = BLACK;
TreeMap put()方法
对于新节点的插入有如下三个关键地方:
1、插入新节点总是红色节点 。
2、如果插入节点的父节点是黑色, 能维持性质 。
3、如果插入节点的父节点是红色, 破坏了性质. 故插入算法就是通过重新着色或旋转, 来维持性质 。
TreeSet
都是用TreeMap实现的
//构造函数
public TreeSet() {
this(new TreeMap<E,Object>());
}