核心代碼:
package com.wayboo;
import java.util.TreeSet;
/*
* TreeSet:能夠?qū)υ匕凑漳撤N規(guī)則進(jìn)行排序榆纽。
* 排序有兩種方式
* A:自然排序
* B:比較器排序
*
* TreeSet集合的特點(diǎn):排序和唯一
*
* 通過觀察TreeSet的add()方法游盲,我們知道最終要看TreeMap的put()方法唁毒。
*/
public class TreeSetDemo {
public static void main(String[] args) {
// 創(chuàng)建集合對象
// 自然順序進(jìn)行排序
TreeSet<Integer> ts = new TreeSet<Integer>();
// 創(chuàng)建元素并添加
// 20,18,23,22,17,24,19,18,24
//自動裝箱
ts.add(20);
ts.add(18);
ts.add(23);
ts.add(22);
ts.add(17);
ts.add(24);
ts.add(19);
ts.add(18);
ts.add(24);
// 遍歷
for (Integer i : ts) {
System.out.println(i);
}
}
}
集合框架(TreeSet保證元素排序的源碼解析)
interface Collection {...}
interface Set extends Collection {...}
interface NavigableMap {
}
class TreeMap implements NavigableMap {
public V put(K key, V value) {
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;
}
int cmp;
Entry<K,V> parent;
// split comparator and comparable paths
Comparator<? super K> cpr = comparator;
if (cpr != null) {
do {
parent = t;
cmp = cpr.compare(key, t.key);
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else
return t.setValue(value);
} while (t != null);
}
else {
if (key == null)
throw new NullPointerException();
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);
}
Entry<K,V> e = new Entry<>(key, value, parent);
if (cmp < 0)
parent.left = e;
else
parent.right = e;
fixAfterInsertion(e);
size++;
modCount++;
return null;
}
}
class TreeSet implements Set {
private transient NavigableMap<E,Object> m;
public TreeSet() {
this(new TreeMap<E,Object>());
}
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
}
真正的比較是依賴于元素的compareTo()方法,而這個方法是定義在 Comparable里面的。
所以致稀,你要想重寫該方法,就必須是先 Comparable接口。這個接口表示的就是自然排序乖坠。
- 郵箱:ithelei@sina.cn
- 技術(shù)討論群:687856230
- GoodLuck