一,TreeSet排序方式
使用TreeSet类方式进行排序要用到Comparator构造器,当我们创建一个TreeSet对象时,在括号内需要完成一个匿名内部类的代码编写,而这个匿名内部类就会当作一个Comparator对象传递给给TreeSet的有参构造器
public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<>(comparator)); }
之后再把comparator对象赋给TreeMap自身的comparator,这个参数还是Comparator类型,然后在源码中调用Comparator比较的时候使用的Compare方法就是我们自己写的匿名内部类。
public TreeMap(Comparator<? super K> comparator) { this.comparator = comparator; }
因此TreeSet的底层还是TreeMap。
public static void main(String[] args) { Set set=new TreeSet(new Comparator() { @Override public int compare(Object o1, Object o2) { int length=((String)o1).length()-((String)o2).length(); if(length==0){ return((String)o1).compareTo(((String) o2)); } return length; } }); set.add("Jack"); set.add("Lucy"); set.add("Tom"); System.out.println(set);
当需要比较的时候, 就会进入到TreeMap里面的put方法,如下代码所示。
private V put(K key, V value, boolean replaceOld) {
Entry<K,V> t = root;
if (t == null) {
addEntryToEmptyMap(key, value);
return null;
}
int cmp;
Entry<K,V> parent;
// split comparator and comparable paths
Comparator<? super K> cpr = comparator;
if (