[JavaMap interface] Source code interpretation of TreeMap and TreeSet

Demo Dragon 2022-08-15 17:11:52 阅读数:225

javamapinterfacesourcecodeinterpretation

1.TreeMap源码解读

  1. 使用默认的构造器,创建TreeMap, 是无序的(也没有排序).
  2. 要求:按照传入的 k(String) 的大小进行排序.
  3. 按照传入的 k(String) 的大小进行排序
  4. 按照K(String) 的长度大小排序

解读源码:

  1. 构造器. 把传入的实现了 Comparator接口的匿名内部类(对象),传给给TreeMap的comparator
    public TreeMap(Comparator<? super K> comparator) {
    this.comparator = comparator;
    }

  2. 调用put方法
    2.1 第一次添加, 把k-v 封装到 Entry对象,放入root
    Entry<K,V> t = root;
    if (t == null) {
    compare(key, key); // type (and possibly null) check

    root = new Entry<>(key, value, null);
    size = 1;
    modCount++;
    return null;
    }
    2.2 以后添加
    Comparator<? super K> cpr = comparator;
    if (cpr != null) {
    do { //遍历所有的key , 给当前key找到适当位置
    parent = t;
    cmp = cpr.compare(key, t.key);//动态绑定到我们的匿名内部类的compare
    if (cmp < 0)
    t = t.left;
    else if (cmp > 0)
    t = t.right;
    else //如果遍历过程中,发现准备添加Key 和当前已有的Key 相等,就不添加
    return t.setValue(value);
    } while (t != null);
    }
    */

package com.hspedu.map_;
import java.util.Comparator;
import java.util.TreeMap;
/** * @author Demo龙 * @version 1.0 */
@SuppressWarnings({
"all"})
public class TreeMap_ {

public static void main(String[] args) {

// TreeMap treeMap = new TreeMap();
TreeMap treeMap = new TreeMap(new Comparator() {

@Override
public int compare(Object o1, Object o2) {

//return ((String) o2).compareTo((String) o1);
return ((String) o2).length() - ((String) o1).length();
}
});
treeMap.put("jack", "杰克");
treeMap.put("tom", "汤姆");
treeMap.put("kristina", "克瑞斯提诺");
treeMap.put("smith", "斯密斯");
treeMap.put("jjj", "Demo龙");//加入不了
System.out.println("treemap=" + treeMap);
}
}

测试结果
在这里插入图片描述

2.TreeSet源码解读

  1. 当我们使用无参构造器,创建TreeSet时,仍然是无序的
  2. 老师希望添加的元素,按照字符串大小来排序
  3. 使用TreeSet 提供的一个构造器,可以传入一个比较器(匿名内部类)
    简单看看源码
  1. 构造器把传入的比较器对象,赋给了 TreeSet的底层的 TreeMap的属性this.comparator
    public TreeMap(Comparator<? super K> comparator) {
    this.comparator = comparator;
    }
  2. 在 调用 treeSet.add(“tom”), 在底层会执行到 if (cpr != null) {//cpr 就是我们的匿名内部类(对象)
    do {
    parent = t;
    //动态绑定到我们的匿名内部类(对象)compare
    cmp = cpr.compare(key, t.key);
    if (cmp < 0)
    t = t.left;
    else if (cmp > 0)
    t = t.right;
    else //如果相等,即返回0,这个Key就没有加入
    return t.setValue(value);
    } while (t != null);
    }
    */
package com.hspedu.set_;
import java.util.Comparator;
import java.util.TreeSet;
/** * @author Demo龙 * @version 1.0 */
@SuppressWarnings({
"all"})
public class TreeSet_ {

public static void main(String[] args) {

/* 1. 构造器把传入的比较器对象,赋给了 TreeSet的底层的 TreeMap的属性this.comparator public TreeMap(Comparator<? super K> comparator) { this.comparator = comparator; } 2. 在 调用 treeSet.add("tom"), 在底层会执行到 if (cpr != null) {//cpr 就是我们的匿名内部类(对象) do { parent = t; //动态绑定到我们的匿名内部类(对象)compare cmp = cpr.compare(key, t.key); if (cmp < 0) t = t.left; else if (cmp > 0) t = t.right; else //如果相等,即返回0,这个Key就没有加入 return t.setValue(value); } while (t != null); } */
// TreeSet treeSet = new TreeSet();
TreeSet treeSet = new TreeSet(new Comparator() {

@Override
public int compare(Object o1, Object o2) {

//下面 调用String的 compareTo方法进行字符串大小比较
//如果要求加入的元素,按照长度大小排序
//return ((String) o2).compareTo((String) o1);
return ((String) o1).length() - ((String) o2).length();
}
});
//添加数据.
treeSet.add("jack");
treeSet.add("tom");//3
treeSet.add("sp");
treeSet.add("a");
treeSet.add("abc");//3
System.out.println("treeSet=" + treeSet);
}
}

演示结果
在这里插入图片描述

copyright:author[Demo Dragon],Please bring the original link to reprint, thank you. https://en.javamana.com/2022/227/202208151636398105.html