我已經做了一些改動來清理你的代碼(原通用型和unchecked轉換的使用),並作出日誌輸出有些更深入:
import java.util.SortedSet;
import java.util.TreeSet;
public class Corner {
public static void main(String[] args) {
SortedSet<String> t1 = new TreeSet<String>();
SortedSet<String> t2 = new TreeSet<String>();
t1.add("b");
t1.add("7");
System.out.println(t1 + " " + t2);
t2 = t1.subSet("5", "c");
System.out.println(t1 + " " + t2);
t1.add("d");
System.out.println(t1 + " " + t2);
t2.add("6");
System.out.println(t1 + " " + t2);
try {
t2.add("3");
} catch (Exception e) {
e.printStackTrace(System.out);
}
System.out.println(t1 + " " + t2);
}
}
輸出如下此:
[7, b] []
[7, b] [7, b]
[7, b, d] [7, b]
[6, 7, b, d] [6, 7, b]
java.lang.IllegalArgumentException: key out of range
at java.util.TreeMap$NavigableSubMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at Corner.main(Corner.java:18)
[6, 7, b, d] [6, 7, b]
好的, 「b」 和插入後 「7」,T1包含那些元素在ASCII(或Unicode)的排序順序。 t2是空的。這裏毫不奇怪。
調用subSet
後,由於給定範圍「5」到「c」跨越原始集合的整個當前範圍從「7」到「b」,兩組具有相同的內容。也不奇怪。
請注意:子集由原始集合支持,如API JavaDoc所述。
此外,API描述說返回的集合將嘗試在其範圍外插入元素時嘗試輸入IllegalArgumentException
。這將在稍後重要。
好的,接下來您將元素「d」添加到t1中,t1中顯示,但不顯示在t2中,因爲「d」在t2的範圍「5」到「c」之外。
現在您將元素「6」添加到t2(仍然支持t1!)。它處於t2的正確範圍內,因此已成功添加到兩個邏輯集中。
現在您遇到了麻煩,因爲您嘗試向t2添加「3」,超出範圍「5」到「c」,因此導致在日誌輸出中可以看到IllegalArgumentException
。元素是而不是插入到t2中(因此也不會插入到t1中)。因此它不會顯示在日誌輸出的最後一行。
底線:根據JDK文檔,您的程序的行爲與預期相同。 :-)
非常感謝您的詳細解答 –