我有下面的代碼,我試圖把StringBuffer對象作爲鍵在TreeSet中。我這樣做的原因是看我是否可以將可變對象作爲關鍵字。我沒有收到任何編譯錯誤。但是當我運行這段代碼時,我得到了代碼下面的錯誤。 特別,我得到這個java.lang.StringBuffer cannot be cast to java.lang.Comparable
。這個錯誤表明什麼?我看到StringBuffer類聲明爲final(public final class StringBuffer
),這不是說它是不可變的,因此可以哈希?可以StringBuffer對象是Java中TreeSet中的鍵嗎?
我是哈希和不可變的東西的新手,所以請在這裏幫助我。
感謝
import java.util.*;
class MutableKeys {
public static void main(String[] args) {
StringBuffer one = new StringBuffer("one");
StringBuffer two = new StringBuffer("two");
StringBuffer three = new StringBuffer("three");
Set<StringBuffer> sb=new TreeSet<StringBuffer>();
sb.add(one);
sb.add(two);
sb.add(three);
System.out.println("set before change: "+ sb);
one.append("onemore");
System.out.println("set After change: "+ sb);
}
}
Exception in thread "main" java.lang.ClassCastException: java.lang.StringBuffer cannot be cast to java.lang.Comparable
at java.util.TreeMap.put(TreeMap.java:542)
at java.util.TreeSet.add(TreeSet.java:238)
at inheritance.MutableKeys.main
如果他修改StringBuffer並搜索它的舊值或它新值將永遠不會被找到,因爲二進制搜索將索引到compareTo永遠不會= 0的位置;除了特殊情況下,更改仍將值放在相同的樹相對位置。 海報底線。不要改變密鑰。非常非常糟糕。你基本上失去了數據 –