当前位置: 首页 > 面试题库 >

如何使HashMap使用数组作为键?

谭浩皛
2023-03-14
问题内容

我使用布尔数组作为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,它使用参考来计算哈希码(默认实现)。因此,对于阵列的哈希码是参照相关的,这意味着你会得到不同的散列码值ta。此外,equals由于这也是基于引用的,因此不适用于两个数组。

您执行此操作的唯一方法是创建一个自定义类,该类将boolean数组保留为内部成员。然后,您需要重写equalshashCode以确保包含具有相同值的数组的实例相等并且具有相同的哈希码的方式重写。

一个更简单的选择可能是List<Boolean>用作密钥。根据文档,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());
}

如您所见,它取决于列表中的值而不是引用,因此这对您来说应该有效。



 类似资料:
  • 我想知道是否可以读取具有以下结构的文本文件 但是在hashmap中有更多的行,其中日期是键,而值是等等?即使有相同日期的倍数,也有可能在同一日期/键中存储多个值吗?

  • 问题内容: 我想使用杰克逊将下面的json数组转换为java hashmap并迭代如下值: 需要这样的输出: JSON示例:在此处输入代码 如果有人可以共享代码以实现此目标,将不胜感激。 谢谢你的帮助! 问题答案: 这是一个揭示想法的解决方案:

  • 我是Java 8流的新手。请提供建议,如何转换流<代码>流 例如,我在代码中有一些流: 我怎么能做这样的事 ? 对不起,我的英语不好。

  • 我有一个Kafka信息流,想建立一个

  • 问题内容: 我想制作一个ExpandableListView,它从服务器(JSON数组)的响应中为其组及其子级获取数据。这是我的json: “ alamat”和“ nama”将成为组,“ begdate”和“ enddate”将成为其子项。我从这里开始按照以下教程操作:http://en.wikicode.org/index.php/Custom_ExpandableListView,但是当我实现

  • 问题内容: 我正在从返回JSON格式数据的服务器请求数据。发出请求时,将HashMap转换为JSON并不难,但另一种方式似乎有些棘手。JSON响应如下所示: 哪种方法最容易访问此数据?我正在使用GSON模块。 问题答案: 干得好: