集合笔记之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比较[遍历比较],如果比较后,不相同,就加入,否则就不加入.