gpt4 book ai didi

java - 如何使 HashMap 以数组为键工作?

转载 作者:IT老高 更新时间:2023-10-28 20:45:16 24 4
gpt4 key购买 nike

我使用 boolean 数组作为 HashMap 的键。但是问题是当不同的数组作为键传递时,HashMap 无法获取键,尽管元素是相同的。 (因为它们是不同的对象)。

我怎样才能使它使用数组作为键?这是代码:

public class main {
public static HashMap<boolean[], Integer> h;


public static void main(String[] args){
boolean[] a = {false, false};

h = new HashMap<boolean[], Integer>();
h.put(a, 1);


if(h.containsKey(a)) System.out.println("Found a");

boolean[] t = {false, false};

if(h.containsKey(t)) System.out.println("Found t");
else System.out.println("Couldn't find t");

}

}

数组 at 都包含相同的元素,但 HashMap 不为 t 返回任何内容。

如何让它发挥作用?

最佳答案

你不能这样做。两个ta会有不同的hashCode()值,因为 java.lang.Array.hashCode()方法继承自 Object ,它使用引用来计算哈希码(默认实现)。因此,数组的哈希码是依赖于引用的,这意味着您将获得 t 的不同哈希码值。和 a .此外,equals不适用于这两个数组,因为这也是基于引用。

您可以做到这一点的唯一方法是创建一个自定义类来保留 boolean数组作为内部成员。然后你需要覆盖equalshashCode这样可以确保包含具有相同值的数组的实例是相等的并且也具有相同的哈希码。

更简单的选择可能是使用 List<Boolean>作为关键。根据 documentation hashCode() List 的实现定义为:

int hashCode = 1;
Iterator<E> i = list.iterator();
while (i.hasNext()) {
E obj = i.next();
hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
}

如您所见,它取决于列表中的值而不是引用,因此这应该适合您。

关于java - 如何使 HashMap 以数组为键工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15576009/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com