Java自学笔记——TreeSet

本文是Java自学笔记的一部分,主要探讨TreeSet的特点,包括无参构造器创建的无序特性以及如何通过自定义比较器进行排序。同时,文章也提及了TreeMap的原理,指出它与TreeSet的相似之处,特别是在键值对存储和判断对象相等的方式。最后,文章提到了在选择集合时应考虑的因素。

Java自学笔记——TreeSet

TreeSet特点

  1. 无参构造器 仍然是无序的
  2. 使用TreeSet构造器,可以传入一个比较器(匿名内部类),指定排序规则

无参构造器 以添加对象实现的Compareable接口的compareTo
Comparable<? super K> k = (Comparable<? super K>) key
使用TreeSet构造器,可以传入一个比较器(匿名内部类),去重时按这个方法去重,而不是调用equals()

import java.util.Comparator;
import java.util.TreeSet;

/**
 * @author Lspero
 * @version 1.0
 */
@SuppressWarnings("all")
public class TreeSet_ {
    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);
                //按字符串长度排序
                //return ((String) o2).length() - ((String) o1).length();
            }
        });
        treeSet.add("jack");
        treeSet.add("jhon");
        treeSet.add("mary");
        treeSet.add("a");
    }
}

add()源码,调用compare()判断是否为同一对象

        //1.构造器把传入的比较器对象,赋给TreeSet底层的TreeMap的属性this.comparator
        public TreeMap(Comparator<? super K> comparator) {
            this.comparator = comparator;
        }
        
        //2.在调用add()时会执行
        if (cpr != null) {//cpr匿名内部类
            do {
                parent = t;
                cmp = cpr.compare(key, t.key);//动态绑定到匿名内部类的compare
                if (cmp < 0)
                    t = t.left;
                    
                else if (cmp > 0)
                    t = t.right;
                    
                else//如果相等,返回0,该数据不会加入,如果比较器为长度,则长度相等则加不进去
                    return t.setValue(value);
                    
            } while (t != null);
        }

TreeMap

与TreeSet相同,不过存储的是键值对,以Key的compare()判断是否为同一对象

import java.util.Comparator;
import java.util.TreeMap;

/**
 * @author Lspero
 * @version 1.0
 */
@SuppressWarnings("all")
public class TreeMap_ {
    public static void main(String[] args) {
        TreeMap treeMap = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String) o1).compareTo((String) o2);
            }
        });
        treeMap.put("jack", "杰克");
        treeMap.put("tom", "汤姆");
        treeMap.put("smith", "斯密斯");
    }
}

put()源码

        //1.构造器 把实现的Comparator匿名内部类传入this.ompare
        //2.调用put方法
        //2.1 第一次添加 把K-V封装到Entry对象,放入root
        Entry<K,V> t = root;
        if (t == null) {
            //检测key是否为空
            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);//动态绑定到匿名内部类
                
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else  //如果准备添加的key与已有的Key相等,则不添加,不是替换,由compare方法决定
                    return t.setValue(value);
                    
            } while (t != null);
        }

集合的选择

1. 判断存储类型:一组对象 或 键值对
2. 一组对象:Collection接口
    允许重复:List
        增删多:LinkedList 双向链表
        改查多:ArrayList  可变数组
    不允许重复:Set
        无序:HashSet 底层是HashMap,维护一个哈希表(数组+链表+红黑树)
        排序:TreeSet
        插入取出顺序一致:LinkedHashSet 维护数组+双向链表
3. 一对键值对:Map
    键无序:HashMap 数组+链表+红黑树 jdk7没有红黑树
    键排序:TreeMap
    键插入取出顺序一致:LinkedHashMap
    读取文件夹:Properties
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值