Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.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_Hashmap_Hashset - Fatal编程技术网

我能否以某种方式检索存储在java哈希集中的密钥?

我能否以某种方式检索存储在java哈希集中的密钥?,java,hashmap,hashset,Java,Hashmap,Hashset,我正在尝试执行双向星型搜索,在中遇到了这个问题 假设hashset H中有一个对象A。假设有另一个对象B,这样A.equalsB为true,它们的散列值也相同,尽管A和B指向不同的对象。现在,当我检查对象B是否在hashset H中时,它会像预期的那样返回true。但是,假设现在我想访问对象A中的某个属性,基于此,我需要访问对象A。请注意,访问B中的同一属性将不起作用,因为它们仅在equals方法下相等,但不指向同一对象。我怎样才能做到这一点 一种方法是使用Hashmap,这样值类型与键类型相同

我正在尝试执行双向星型搜索,在中遇到了这个问题

假设hashset H中有一个对象A。假设有另一个对象B,这样A.equalsB为true,它们的散列值也相同,尽管A和B指向不同的对象。现在,当我检查对象B是否在hashset H中时,它会像预期的那样返回true。但是,假设现在我想访问对象A中的某个属性,基于此,我需要访问对象A。请注意,访问B中的同一属性将不起作用,因为它们仅在equals方法下相等,但不指向同一对象。我怎样才能做到这一点


一种方法是使用Hashmap,这样值类型与键类型相同,每次我在Hashmap中存储某个键时,我都会将同一个对象与其值一起存储。但这会导致存储值的额外内存开销,而我真正需要的是密钥本身的副本。有没有其他方法可以做到这一点?

我不相信有任何方法可以使用HashSet有效地做到这一点。当然,您可以列出所有键并检查它们是否相等


然而,尽管HashMap方法会让人恼火,但实际上它不会占用更多内存。HashSet至少在股票JDK 7中使用HashMap实现,因此每个集合条目都有一个完整的映射条目。。。并且不需要额外的内存来存储值,因为它们都只是对同一个对象的引用。

我认为没有任何方法可以有效地使用HashSet来实现这一点。当然,您可以列出所有键并检查它们是否相等


然而,尽管HashMap方法会让人恼火,但实际上它不会占用更多内存。HashSet至少在股票JDK 7中使用HashMap实现,因此每个集合条目都有一个完整的映射条目。。。不需要额外的内存来存储值,因为它们都只是对同一个对象的引用。

您可以迭代HashSet中的所有值并检查B的equals方法。如果迭代器返回一个等于B的对象,您就找到了A。

您可以迭代HashSet中的所有值并检查B的equals方法。如果迭代器返回一个等于你找到的B

一种方法是使用Hashmap,这样值类型与键类型相同,每次我在Hashmap中存储某个键时,我都会将同一个对象与其值一起存储。但这会导致存储值的额外内存开销,而我真正需要的是密钥本身的副本

事实上,HashSet的实现至少在Java7中的OracleJavaSE库中实现。因此,您对HashMap的额外内存使用的担忧是没有根据的

以下是源代码的链接:

顺便说一句,内部映射被声明为HashMap而不是HashMap。读者的思考练习:他们为什么这样做

使用HashSet的另一个合理的选择是迭代set元素,测试每个元素,看看它是否与您正在寻找的元素相等。这显然是非常低效的时间

一种方法是使用Hashmap,这样值类型与键类型相同,每次我在Hashmap中存储某个键时,我都会将同一个对象与其值一起存储。但这会导致存储值的额外内存开销,而我真正需要的是密钥本身的副本

事实上,HashSet的实现至少在Java7中的OracleJavaSE库中实现。因此,您对HashMap的额外内存使用的担忧是没有根据的

以下是源代码的链接:

顺便说一句,内部映射被声明为HashMap而不是HashMap。读者的思考练习:他们为什么这样做


使用HashSet的另一个合理的选择是迭代set元素,测试每个元素,看看它是否与您正在寻找的元素相等。这显然是非常耗时的。

因此,如果由于冲突,无法将A和B存储在同一个哈希集中。你打算如何访问它们?@Vash:关键是根据B值找到A值。B值不需要存储在集合中。。。它只是用作查找键。不幸的是,集合不允许您找到任何方法来查找存储在集合中的值,该值恰好等于您提供的键值。@JonSkeet,这是一个很强的假设。但在这种情况下,答案是调用map.getobjectB将返回objectA实例。这就是为什么映射接口在get`And contains方法中不使用泛型类型的原因。@JonSkeet,这就是您在回答中所描述的。在适当的时候。很好。@Vash:我不会说这是一个强有力的假设——这是对这个问题的一种解释,我认为这是一个相当合理的假设。问题中的所有内容都与之一致。那么如果

由于冲突,不能将A和B存储在同一哈希集中。你打算如何访问它们?@Vash:关键是根据B值找到A值。B值不需要存储在集合中。。。它只是用作查找键。不幸的是,集合不允许您找到任何方法来查找存储在集合中的值,该值恰好等于您提供的键值。@JonSkeet,这是一个很强的假设。但在这种情况下,答案是调用map.getobjectB将返回objectA实例。这就是为什么映射接口在get`And contains方法中不使用泛型类型的原因。@JonSkeet,这就是您在回答中所描述的。在适当的时候。很好。@Vash:我不会说这是一个强有力的假设——这是对这个问题的一种解释,我认为这是一个相当合理的假设。问题中的所有内容都与此一致。这很好,但至少还将存储引用本身的副本,对吗?我知道内存很小,但为什么还要存储呢?@ashu:HashSet已经存储了一个引用的副本-只是它是对HashSet.PRESENT的引用。它也不像存储非空引用比空引用占用更多的空间:正如我所说,它在内部使用HashMap,因此每个条目在逻辑上都有一个值,并且会有一个与该值关联的字段,而不管该值实际上是什么。所以没有更多的内存使用。是的,我只是理解。谢谢这很好,但至少也会存储引用本身的副本,对吗?我知道内存很小,但为什么还要存储呢?@ashu:HashSet已经存储了一个引用的副本-只是它是对HashSet.PRESENT的引用。它也不像存储非空引用比空引用占用更多的空间:正如我所说,它在内部使用HashMap,因此每个条目在逻辑上都有一个值,并且会有一个与该值关联的字段,而不管该值实际上是什么。所以没有更多的内存使用。是的,我只是理解。谢谢我想不出关于思维实验部分的答案。你能解释一下吗?@ashu-这很微妙。当您使用get返回的值时。。。在HashMap上,有一个将结果隐式转换为E类型的类型转换。但是在本例中,HashSet只测试值是否为null,或者对其调用Object.equals。这两个都不需要E。因此,通过使用Object,实现避免了某些Set操作中不必要的类型转换。但我确实认为equals需要Emethod@ashu-不需要在编译时调用。它是执行调用所必需的,但是在运行时由普通的Java多态方法调度来处理。好了,我现在明白了!我想不出关于思维实验部分的答案。你能解释一下吗?@ashu-这很微妙。当您使用get返回的值时。。。在HashMap上,有一个将结果隐式转换为E类型的类型转换。但是在本例中,HashSet只测试值是否为null,或者对其调用Object.equals。这两个都不需要E。因此,通过使用Object,实现避免了某些Set操作中不必要的类型转换。但我确实认为equals需要Emethod@ashu-不需要在编译时调用。它是执行调用所必需的,但是在运行时由普通的Java多态方法调度来处理。好了,我现在明白了!