我有以下代码,试图将StringBuffer对象作为键放入TreeSet中。我这样做的原因是看是否可以将可变对象用作键。我没有任何编译错误。但是当我运行此代码时,我得到了代码下方的错误。特别是,我得到这个java.lang.StringBuffer cannot be cast to java.lang.Comparable
。此错误表示什么?
从javadoc中我看到StringBuffer类被声明为final(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
只需添加一个比较器类,然后在TreeSet中使用它,如下所示:
class Comparatorbuff implements Comparator<StringBuffer> {
@Override
public int compare(StringBuffer s1, StringBuffer s2) {
return s1.toString().compareTo(s2.toString());
}
}
in your main method: modify as follows
Set<StringBuffer> sb=new TreeSet<StringBuffer>(new Comparatorbuff());
问题内容: 当我开始使用Java时,向我暗示我们有两种不同的类型: 我刚从教授那里拿回一份考试,这种差异意味着两个选择作为答案之间的差异。当我请教授澄清时,他告诉我原始值可以是对象。 谁在这里,谁能给我任何证据?证明将是官方的声音,我会选择答案作为答案,同时还会奖励一些众所周知的互联网。 问题答案: 原始值可以视为对象吗? 答案是不。 该JLS状态 Java编程语言中有 两种类型 :基本类型(第4
问题内容: 我以为只有不可变的对象才可以是字典键,但是上面的对象是可变的。 问题答案: 具有hash方法的任何对象都可以是字典键。对于您编写的类,此方法默认返回基于id(self)的值,并且如果相等性不是由这些类的标识决定的,则将它们用作键可能会让您感到惊讶: 在2.6版中进行了更改:__hash__现在可以设置为None,以将类实例明确标记为不可哈希。[ hash ]
问题内容: 如下面的代码: 输出为: 是否可以将地图的键设置为准确的数据,而不仅仅是对象的地址?怎么样? 问题答案: 使用JSON时,可以在地图中将对象作为键吗? 严格没有。JSON 映射 数据结构是JSON 对象 数据结构,它是名称/值对的集合,其中元素名称必须是字符串。因此,尽管以映射的形式感知并绑定到JSON对象是合理的,但是JSON映射键也必须是字符串- 再次,因为JSON映射是JSON对
问题内容: 我正在阅读Head First Java的书中的一句话: 关键是哈希码可以相同,而不必保证对象相等,因为该方法中使用的“哈希算法” 可能会为多个对象返回相同的值。 为什么该方法可能为不同的对象返回相同的值?这不会引起问题吗? 问题答案: *对对象进行 *散列 意味着“ 找到可以由相同实例一次又一次地再现的良好的描述性值(数字) ”。由于Java的哈希码类型为,因此只能具有不同的值。这就
问题内容: 我正在学习《 Java SE 7程序员I和II学习指南》,但我不理解下面的解释。 哪几行代码破坏了封装?答案:第9行。“封装诸如ArrayList之类的可变对象时,您的getter必须返回对该对象副本的引用,而不仅仅是对原始对象的引用”。 我既不理解解释,也不了解如何修改原始代码。 所以在getList()而不是 我们应该这样做吗? 问题答案: 您将替换为: 与: 否则客户可以做… 破
本文向大家介绍Java 中的 String对象为什么是不可变的,包括了Java 中的 String对象为什么是不可变的的使用技巧和注意事项,需要的朋友参考一下 什么是不可变对象? String对象是不可变的,但这仅意味着你无法通过调用它的公有方法来改变它的值。 众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再