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

具有Int数组的Java HashMap

颜安宁
2023-03-14
问题内容

我正在使用此代码来检查数组是否存在HashMap

public class Test {
    public static void main(String[] arg) {
        HashMap<int[], String> map = new HashMap<int[], String>();
        map.put(new int[]{1, 2}, "sun");
        System.out.println(map.containsKey((new int[]{1, 2})));
    }
}

但这印出来False。如何检查数组中是否存在HashMap


问题答案:

问题是因为两者int[]不相等。

System.out.println(
    (new int[] { 1, 2 }).equals(new int[] { 1, 2 })
); // prints "false"

Map和其他Java Collections Framework类根据定义了其接口equals。来自Map API

Collections Framework接口中的许多方法都是根据equals方法定义的。例如,该containsKey(Object key)方法的规范说:“ true当且仅当此映射包含k诸如这样的键的映射时,才返回(key==null ? k==null : key.equals(k))。”

注意,它们不必是同一对象。他们一定是equals。Java中的数组从扩展Object,其默认实现的equalsreturn仅在对象标识上才返回true;因此,为什么要false在上面的代码段中进行打印。

您可以通过多种方式之一解决问题:

  • equals使用using 方法的数组定义自己的包装器类。 java.util.Arrays equals/deepEquals
    • 并且不要忘记,当您时@Override equals(Object),您还必须@Override hashCode
  • 使用类似List<Integer>的是 没有 定义equals在它们所包含的价值观方面
  • 或者,如果您 可以 使用的引用相等equals,则 可以 坚持使用现有的东西。就像您不希望上面的代码片段一起打印一样true,您也不应该仅凭其值就可以找到数组。您必须每次都坚持使用并使用原始参考。

API

  • Object.equalsObject.hashCode
    • 对于Java程序员来说,了解这些合同以及如何使其与系统的其余部分一起使用非常重要。


 类似资料:
  • 问题内容: 每次我尝试运行此方法 我收到一个IndexOutOfBounds错误。我不知道为什么,因为我在数组中提供了足够的项目来更改: 有谁知道为什么我会收到此错误? 问题答案: 您的索引偏离了一个;它应该从0开始:

  • 我是一名 Java 初学者,我一直在尝试编写一种方法来列出数组中某个 int 的所有索引。到目前为止,我所做的是将该 int 的值存储在另一个数组中的相应索引处,但我能做的最好的事情就是将所有其他不等于原始 int 的索引的值设置为 -1。 我想我需要在数组中存储值I,并删除所有的-1,但是我不知道怎么做。顺便说一下,这些值是-1,因为这个程序中所有的数组都包含0-100之间的整数。如果数组中的整

  • 我正在尝试用java swing制作一个Tic-Tac-Toe程序,我已经制作了框架。如何让JButton数组中的按钮激活int数组?我希望int数组保存Tic-Tac-Toe网格中点的值,因此当按下按钮时,int数组中的对应点将是0或1,按钮的文本将更改为X或O。

  • 问题内容: 使用,我可以比较和删除相似的项目,但是如果我有以下数组怎么办? 阵列1 数组2 我想过滤掉类似的物品;结果应该返回4.如何重新排列数组以便可以使用? 问题答案: 我可能会遍历原始数组并使它们成为一维的…类似

  • 使用,为什么它显示(原始类型)和数组的不同列表大小? a) 使用array,每当我执行以下程序时,列表大小=1 b) 但是如果我从数组类型更改为数组(比如),那么我得到的列表大小是4,我认为是正确的。 PS:使用(包装类)数组,结果就可以了,但我不确定为什么在primitive数组中,列表大小是1。请解释一下。

  • 问题内容: 什么是C#的Java等价物: 问题答案: 如果需要属性,则需要这样定义: 您可以这样使用它: 要意识到的是,这只是创建类的捷径,因此您可以向该类添加所需的任何属性和方法。 如果您不想在自己的方法上定义任何方法,则可以更改成员变量的范围并进行设置,但这不是它们在Sun网站上的示例中所做的。