java - StringBuffer 对象可以成为 Java 中 TreeSet 中的键吗?

标签 java hashset comparable treeset stringbuffer

我有以下代码,我试图将 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

最佳答案

  1. StringBufferpublic final class StringBuffer 的事实意味着您不能对其进行子类化。 StringBuffer 非常可变(这就是重点,您可以修改缓冲区的内容。)

  2. 您不想使用可变的东西作为键,因为在修改对象之后,它的 equals() 和 hashcode() 方法将返回不同的结果,您将无法找到它不再出现在 map 中。

  3. 如果您真的想在 TreeSet 中使用 StringBuffer,则必须提供自己的 Comparator,因为 StringBuffer 没有实现 Comparable。

关于java - StringBuffer 对象可以成为 Java 中 TreeSet 中的键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30200234/

相关文章:

即使声明了可比较,Java Collections.sort() 也不起作用

java - 创建比较器以传递给 java 中的 .sort() 不适合方法错误

java - NumberFormat.getInstance 是否保证创建一个新实例?

java - 为什么我们可以为 TreeSet 提供 Comparator,但不能为 HashSet 提供类似 Hasher 的东西?

c# - HashSet 的内存限制是多少?

java - 迭代时向 HashSet 添加元素

java - 如何在 Java 中的字符串上使用 Comparable CompareTo

java - eclipse中的快捷方式与tab相反?

Java ServerSocket 绑定(bind)到 Hamachi 端口

java - 如何使用 Jackson 2 将集合的子类序列化和反序列化为已知集合