我有以下代码,我试图将 StringBuffer 对象作为键放入 TreeSet。我这样做的原因是看看我是否可以将可变对象作为键。我没有收到任何编译错误。但是当我运行这段代码时,我得到了代码下方的错误。
特别是,我得到了这个 java.lang.StringBuffer cannot be cast to java.lang.Comparable
。这个错误说明了什么?
从 javadoc 中我看到 StringBuffer 类被声明为最终类(public final class StringBuffer
),这是否意味着它是不可变的,因此是可哈希的?
我是散列和不可变内容的新手,所以请在这里帮助我。
谢谢
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
是public final class StringBuffer
的事实意味着您不能对其进行子类化。 StringBuffer 非常可变(这就是重点,您可以修改缓冲区的内容。)您不想使用可变的东西作为键,因为在修改对象之后,它的 equals() 和 hashcode() 方法将返回不同的结果,您将无法找到它不再出现在 map 中。
如果您真的想在 TreeSet 中使用 StringBuffer,则必须提供自己的 Comparator,因为 StringBuffer 没有实现 Comparable。
关于java - StringBuffer 对象可以成为 Java 中 TreeSet 中的键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30200234/