集合笔记之TreeSet

集合笔记之TreeSet

TreeSet默认构造器

TreeSet默认构造器,添加字符串,输出是有顺序的

public class TreeSetTest {
    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet();
        treeSet.add("jack");
        treeSet.add("blue");
        treeSet.add("rose");
        treeSet.add("lia");
        treeSet.add("chenhm");
        treeSet.add("abc");
        System.out.println(treeSet);
    }
}

输出结果[abc, blue, chenhm, jack, lia, rose]

源码解读

分析一下源码,为什么会有顺序呢?
treeSet.add()方法,也即是TreeMap.put()方法

else {
            if (key == null)
                throw new NullPointerException();
                 @SuppressWarnings("unchecked")
                // 这个地方会默认获取字符串的compareTo()方法 
                Comparable<? super K> k = (Comparable<? super K>) key;
            do {
                parent = t;
                // 走到字符串比较方法中去
                cmp = k.compareTo(t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }

TreeSet有参构造器传入比较方法

按照字母顺序逆序排序

public class TreeSetTest {
    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //下面调用String的compareTo方法进行字符串大小比较
                return ((String) o2).compareTo((String) o1);
            }
        });
        treeSet.add("jack");
        treeSet.add("blue");
        treeSet.add("rose");
        treeSet.add("lia");
        treeSet.add("chenhm");
        treeSet.add("abc");
        System.out.println(treeSet);
    }
}

输出结果为:[rose, lia, jack, chenhm, blue, abc]
底层数据结构是红黑树,要专门学习数据结构,以求更深入了解。

源码解读

//1,构造器把传入的比较器对象,赋给了TreeSet的底层的TreeMap的属this.comparator
 public TreeMap(Comparator<? super K> comparator) {
    this.comparator = comparator;
 }
//2.在 调用 treeSet.add("tom"),在底层会执行到
 Comparator<? super K> cpr = comparator;
 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 treeSet = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                Integer integer1 = (Integer) o1;
                Integer integer2 = (Integer) o2;
                return integer2.compareTo(integer1);
            }
        });
        treeSet.add(8);
        treeSet.add(6);
        treeSet.add(5);
        treeSet.add(1);
        System.out.println(treeSet);
    }

试分析HashSet和TreeSet分别如何实现去重的

TreeSet去重机制:如果传入了Comparator匿名对象,就使用Comparator去重,如果方法返回0就认为是相同的元素,如果没有传入Comparator匿名对象,则以添加的key对象实现的Comparable接口的compareTo()进行去重。
HashSet去重机制:haskCode()+equals(),底层先通过存入对象,进行运算得到一个hash值,通过hash值得到对应数组的索引,如果发现对应索引值没有对象则直接存入,如果有对象就进行equals比较[遍历比较],如果比较后,不相同,就加入,否则就不加入.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值