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

被折叠的 条评论
为什么被折叠?



