Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java StringBuffer可以用作HashMap中的键吗?_Java_Hashmap - Fatal编程技术网

Java StringBuffer可以用作HashMap中的键吗?

Java StringBuffer可以用作HashMap中的键吗?,java,hashmap,Java,Hashmap,StringBuffer可以作为HashMap中的键吗 如果是这样,使用字符串和StringBuffer作为键有什么区别 StringBuffer可以作为HashMap中的键吗 否,因为覆盖既不等于也不等于hashCode,所以它不适合作为HashMap键(回想一下,HashMap依赖这两种方法来判断给定键是否存在于映射中) 除此之外,StringBuffers是可变的,您通常希望Map键是不可变的。发件人: 注意:如果将可变对象用作贴图键,则必须非常小心。如果对象是贴图中的关键点时,对象的值以

StringBuffer可以作为HashMap中的键吗
如果是这样,使用字符串和StringBuffer作为键有什么区别

StringBuffer可以作为HashMap中的键吗

否,因为覆盖既不等于
也不等于
hashCode
,所以它不适合作为
HashMap
键(回想一下,
HashMap
依赖这两种方法来判断给定键是否存在于映射中)

除此之外,
StringBuffer
s是可变的,您通常希望
Map
键是不可变的。发件人:

注意:如果将可变对象用作贴图键,则必须非常小心。如果对象是贴图中的关键点时,对象的值以影响
等于
比较的方式更改,则不会指定贴图的行为。这项禁令的一个特例是,不允许地图本身包含密钥。虽然允许映射将自身包含为一个值,但建议格外小心:
equals
hashCode
方法在这样的映射上不再得到很好的定义


不,您不能,除非您想区分不同的缓冲区而不是它们的内容。
StringBuffer
类没有实现
equals
hashCode
,这意味着它从
对象
继承了这些方法。这些方法的
Object
实现只区分对象实例,而不区分其内容

换句话说,如果您有两个
StringBuffer
实例具有相同的内容,则它们不会被视为相等。更奇怪的是,如果您使用不同的值重新插入相同的缓冲区,它将被视为与前一个相同



通常,您应该注意使用可变值作为键。突变不会改变
Map
中的位置,因为
Map
实例不会收到更改通知。在这种情况下,由于没有实现
equals
,因此不会出现这个问题。

java中的所有类都打算用作哈希键,因为它们都继承了超级方法
hashCode
。虽然在某些情况下,它可能编译得很好,但会非常奇怪,比如连接或流。。。或字符串缓冲区。这就是为什么:


String
StringBuffer
之间的主要区别在于,字符串在设计上是不可变的,并且它包含了
hashCode
的正确实现<相反,code>StringBuffers
可能会更改,因此,此类没有正确的
hashCode
实现:它不会覆盖从
对象继承的默认实现。现在您可以看到后果:StringBuffer不能包含高质量的散列,也不能与其内容一致,这样会破坏散列算法的结果。

是的,任何对象都可以用作
散列映射中的键,尽管这可能不是一个好主意

类哈希映射

Type Parameters:
    K - the type of keys maintained by this map
    V - the type of mapped values
发件人:

当您将键值对放入映射时,hashmap将查看 密钥的哈希代码,并将该对存储在 标识符是密钥的哈希代码。(……)看看上面 机制,您还可以查看
hashCode()
equals()
键的方法(…)

但是请注意,不会覆盖所需的方法,因此您的“键”将是对象的内存地址。发件人:

(这通常通过转换 对象转换为整数,但此实现技术不适用 JavaTM编程语言要求。)

这意味着它作为一个键的使用将与
字符串
的非常不同:

Map<String, String> hashA = new HashMap<>();
a.put('a', 'a');
System.out.println(hashA.get('a')); //prints 'a'

Map<StringBuffer, String> hashB = new HashMap<>();
StringBuffer buffer = new StringBuffer('a');
hashB.put(buffer, 'a');
System.out.println(hashB.get(new StringBuffer('a'))); //prints null
System.out.println(hashB.get(buffer)); //prints 'a'
Map hashA=new HashMap();
a、 放置('a','a');
System.out.println(hashA.get('a'))//打印“a”
Map hashB=新的HashMap();
StringBuffer=新的StringBuffer('a');
hashB.put(缓冲区'a');
System.out.println(hashB.get(newstringbuffer('a'))//打印空值
System.out.println(hashB.get(buffer))//打印“a”

您指的是哪种语言或库?你应该用它来标记你的问题。@jB语言是java