Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.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 不可变对象和hashmap键_Java - Fatal编程技术网

Java 不可变对象和hashmap键

Java 不可变对象和hashmap键,java,Java,不可变对象(除了String如Integer和其他包装类等)是否适合hashmap键 有人能解释一下怎么做吗?如果你的对象是不可变的,并且正确地实现了hashcode/equals,你可以在hashmap中将它们用作键。如果不可变,对象的hashcode不会改变,它允许缓存不同键的hashcode,这使得整个检索过程非常快。 同样对于可变对象,hashCode()可能依赖于可能更改的字段,如果发生这种情况,您将无法在HashMap中找到键(及其值),因为hashCode()返回不同的值。是,因为

不可变对象(除了
String
Integer
和其他包装类等)是否适合hashmap键


有人能解释一下怎么做吗?

如果你的对象是不可变的,并且正确地实现了hashcode/equals,你可以在hashmap中将它们用作键。

如果不可变,对象的hashcode不会改变,它允许缓存不同键的hashcode,这使得整个检索过程非常快。
同样对于可变对象,hashCode()可能依赖于可能更改的字段,如果发生这种情况,您将无法在HashMap中找到键(及其值),因为hashCode()返回不同的值。

是,因为它是不可更改的

假设我有一节课

MyKey key = new MyKey("shreyansh"); //assume hashCode=1234
myHashMap.put(key, "value");

// Below code will change the key hashCode() and equals()
// but it's location is not changed.
key.setName("jogi"); //assume new hashCode=7890

//below will return null, because HashMap will try to look for key
//in the same index as it was stored but since key is mutated,
//there will be no match and it will return null.
myHashMap.get(new MyKey("shreyansh")); 

在这里,当使用“Shreyans”键访问时,它将返回nulll

您可以在这里找到答案:

String、Integer和其他包装器类是HashMap键的自然候选项,String也是最常用的键,因为String是不可变的和最终的,并重写equals和hashcode()方法。其他包装类也共享类似的属性。为了防止对用于计算hashCode()的字段进行更改,需要具有不可变性,因为如果键对象在插入和检索期间返回不同的hashCode,则无法从HashMap获取对象。不变性是最好的,因为它提供了线程安全等其他优势,如果您可以通过只将某些字段设置为最终字段来保持哈希代码不变,那么您也可以这样做。由于在从HashMap检索值对象时使用equals()和hashCode()方法,所以键对象正确重写这些方法并遵循contact非常重要。若不相等的对象返回不同的hashcode,则发生冲突的可能性将更小,从而提高HashMap的性能

还有另一个讨论堆栈:


HashMap的put-and-get方法中使用了hashcode和equals方法。您需要确保在将值对象与键对象放在一起之后,始终可以从地图中获取值对象。无论是否更改关键对象。但不可变对象足以实现这一点

别担心,你到底想说什么还不清楚。你有什么特别的担心吗?使用可变对象作为键当然不是一个好主意-至少如果它们可以以影响哈希代码的方式发生变化。你想用它实现什么?如果你可以通过只将某些字段设置为最终字段来保持哈希代码不变,你可能会寻找
,然后你也可以这样做。
这是否意味着如果一个键是可变的,但它的hashcode不依赖于可变属性,并且保持不变,那么这个可变对象也可以是一个好的hashmap键?我认为你还需要保持你的equals不变。否则,在更改equals方法的值后,当您再次使用键放置条目时,它不会替换旧值。这不是预期的。@aLearner如果您查看HashMap的源代码,这将对您有好处。