Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.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中返回哈希集中的对象_Java_Hashcode_Hashset - Fatal编程技术网

在Java中返回哈希集中的对象

在Java中返回哈希集中的对象,java,hashcode,hashset,Java,Hashcode,Hashset,嗨,我在一个名为Memory的类中有一个如下所示的哈希集: Set<Idea> ideas = new HashSet<Idea>(); Set ideas=newhashset(); 泛型类型“Idea”是我编写的另一个类,它重写了hashcode()和equals()。 我希望能够在HashSet ideas中获取(而不是删除)Idea对象,然后通过向其添加一些内容(可能会更改其hashcode()返回值)来更改它。我听说这是行不通的,但没有人解释原因。我想知道是

嗨,我在一个名为Memory的类中有一个如下所示的哈希集:

Set<Idea> ideas = new HashSet<Idea>();
Set ideas=newhashset();
泛型类型“Idea”是我编写的另一个类,它重写了hashcode()和equals()。
我希望能够在HashSet ideas中获取(而不是删除)Idea对象,然后通过向其添加一些内容(可能会更改其hashcode()返回值)来更改它。我听说这是行不通的,但没有人解释原因。我想知道是否有人能告诉我如何才能最有效地做到这一点

它不起作用,因为哈希代码是查找对象的关键,如果以这种方式修改对象,更改其哈希代码,则无法再次找到它


这就像字典里的词条,如果你把它改了,你就再也找不到了。这有意义吗?

HashSet内部使用值与键相同的HasMap。要将对象放入HashSet,jvm fill首先计算对象的hashcode,并基于该hashcode,选择相应的bucket并放入对象。因此,如果在将对象放入HashSet后更改hashcode,无法正确获取其位置。因此,如果确实要删除元素,最好从hashset中删除该对象并更改其值,然后再将其放回。如果要执行查找,应使用映射。如果要更改键(或集合的元素),必须先删除它,然后再添加它。因此,您的密钥应该只有不可变字段。

HashSet=HashMap您可以从jdk Source中看到这一点我不明白,使用HashMap可以解决我的问题吗。如果是,怎么做?谢谢@farmer1992他想要一套而不是地图你为什么要“改变”it@Hitman47更好的
Idea
?找到Idea对象、删除Idea对象、更改Idea对象,然后将Idea对象添加回HashSet的最佳方法是什么?如果hashCode不更改,您仍然可以将其保留在HashSet中。如果要更改hashCode,您有两个选项,或者是你提到的那个,删除它,然后再添加,或者使用另一个集合实现,这个集合实现在hashCode方法中不存在。还有其他的实现仍然有效吗?不幸的是,这不是一个选项。您知道哪些实现不依赖hashCode方法吗?