package Nov2016;
import java.util.TreeSet;
public class Ques1108 {
public static void main(String[] args){
Animal dog = new Animal("dog");
Animal cat = new Animal("cat");
TreeSet<Animal> animals = new TreeSet<Animal>();
animals.add(dog);
animals.add(cat);
System.out.println(animals); // 注釋 1 處輸出什麼?
}
}
class Animal implements Comparable<Animal>{
private String name;
Animal(String name){ this.name = name; }
@Override
public int compareTo(Animal o){
return 0; // 關鍵:永遠返回 0
}
@Override
public String toString(){
return name;
}
}
TreeSet 依賴 Comparable.compareTo 維護紅黑樹有序性與去重compareTo 返回 0 表示「相等」(根據 Java 文檔:sgn(x.compareTo(y)) == -sgn(y.compareTo(x)),且 (x.compareTo(y)==0) == (x.equals(y)) 應盡量成立)add(dog) 成功,樹中有 1 個節點add(cat):cat.compareTo(dog) == 0 → TreeSet 判定為重複元素 → 拒絕添加,返回 falsedog[dog]
compareTo == 0 而非 equals()equals 一致return this.name.compareTo(o.name); 按名字排序去重若改為 HashSet:依賴 hashCode() + equals(),未重寫則按地址判斷 → [dog, cat] 兩個元素。
這體現了 SortedSet (TreeSet) 與 HashSet 去重語義的本質差異。
輸出:[dog]