import java.util.Comparator;
import java.util.TreeMap;/**
(1)无参构造方法 public TreeMap() { comparator = null; } private final Comparator<? super K> comparator;//外部比较器用于比较大小 (2)put方法 public V put(K key, V value) { //传入(K,V) Entry<K,V> t = root; //t节点指向根 if (t == null) { // //比较大小 compare(key, key); // type (and possibly null) check //创建一个根节点 root = new Entry<>(key, value, null); size = 1; //个数++ modCount++; return null; } int cmp; //创建一个标记 Entry<K,V> parent; //父节点 // split comparator and comparable paths Comparator<? super K> cpr = comparator; //如果外部比较器不等于null,说明外部比较器存在 if (cpr != null) { do { parent = t; //把root赋给父节点 cmp = cpr.compare(key, t.key); //调用外部比较起 if (cmp < 0) t = t.left; //t指向左子树,向左子树比较 else if (cmp > 0) t = t.right; //t指向右子树,向右子树比较 else return t.setValue(value); //若key相同,值覆盖 } while (t != null); } else { //外部比较器不存在,使用内部比较器进行比较 if (key == null) throw new NullPointerException(); @SuppressWarnings("unchecked") Comparable<? super K> k = (Comparable<? super K>) key; do { parent = t; cmp = k.compareTo(t.key);//调用内部比较器比较 if (cmp < 0) t = t.left; //t指向左子树,向左子树比较 else if (cmp > 0) t = t.right; //t指向右子树,向右子树比较 else return t.setValue(value); //若key相同,值覆盖 } while (t != null); } Entry<K,V> e = new Entry<>(key, value, parent); if (cmp < 0) parent.left = e; //添加到左子树 else parent.right = e; //添加到右子树 fixAfterInsertion(e); //调整树的结构 size++; //数量++ modCount++; return null; } //调整树的结构 private void fixAfterInsertion(Entry<K,V> x) { x.color = RED; //直到x节点的父节点不是根,且x的父节点不是红色while (x != null && x != root && x.parent.color == RED) {
//x的父节点是其祖父节点的左子节点 if (parentOf(x) == leftOf(parentOf(parentOf(x)))) { //获取x的父节点的兄弟节点 Entry<K,V> y = rightOf(parentOf(parentOf(x))); //如果父节点的兄弟节点是红色(需要颜色翻转) if (colorOf(y) == RED) { //将x的父节点设为黑色 setColor(parentOf(x), BLACK); //将x的父节点的兄弟节点设为黑色 setColor(y, BLACK); //将其x的祖父节点设为红色 setColor(parentOf(parentOf(x)), RED); //x指向祖父节点 x = parentOf(parentOf(x)); } else { //如果x是其父节点的右子节点 if (x == rightOf(parentOf(x))) { //将x的父节点设为x x = parentOf(x); rotateLeft(x); } // 把 x 的父节点设为黑色 setColor(parentOf(x), BLACK); // 把 x 的祖父点设为红色 setColor(parentOf(parentOf(x)), RED); rotateRight(parentOf(parentOf(x))); } } else { //x的父节点是其祖父节点的右子节点 //获取x的父节点的兄弟节点 Entry<K,V> y = leftOf(parentOf(parentOf(x))); //如果父节点的兄弟节点是红色(需要颜色翻转) if (colorOf(y) == RED) { //将x的父节点设为黑色 setColor(parentOf(x), BLACK); //将x的父节点的兄弟节点设为黑色 setColor(y, BLACK); //将其x的祖父节点设为红色 setColor(parentOf(parentOf(x)), RED) ; //x指向祖父节点 x = parentOf(parentOf(x)); } else { //如果x是其父节点的左子节点 if (x == leftOf(parentOf(x))) { //将x的父节点设为x x = parentOf(x); rotateRight(x); } // 把 x 的父节点设为黑色 setColor(parentOf(x), BLACK); // 把 x 的祖父点设为红色 setColor(parentOf(parentOf(x)), RED); rotateLeft(parentOf(parentOf(x))); } } } root.color = BLACK; } * */public class TreeMapTest {
public static void main(String[] args){ //创建集合对象 //TreeMap treeMap = new TreeMap(); CompareLength cc = new CompareLength(); TreeMap treeMap = new TreeMap(cc); treeMap.put("hello",123); treeMap.put("world1",456); treeMap.put("hello11",789); treeMap.put("java", 1000); System.out.println(treeMap); System.out.println("集合元素的个数:"+treeMap.size()); System.out.println(treeMap.containsKey("hello")+"\t"+treeMap.containsKey("sql")); System.out.println(treeMap.containsValue(789)+"\t"+treeMap.containsValue(1000)); System.out.println(treeMap.get("java")); }}