【问题标题】:Java put something in a hashmap inside a for loop [duplicate]Java在for循环内的hashmap中放置了一些东西[重复]
【发布时间】:2021-10-11 11:35:30
【问题描述】:

嘿,我只是想说,我是一个 java 新手。 所以我的问题是输出是:a - null 我不知道为什么 我确实将 HashMap 从 HashMap<Integer[], Integer> testHashMap = new HashMap<>(); 更改为 HashMap<Integer, Integer> testHashMap = new HashMap<>(); 然后我工作了

        HashMap<Integer[], Integer> testHashMap = new HashMap<>();
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                Integer[] someInteger = {i, j};
                testHashMap.put(someInteger, (i + j * 4));
            }
        }
        Integer[] someOtherInteger = {0,0};
        System.out.println("a - " + testHashMap.get(someOtherInteger));

outPut:"a - null" 输出应该是:“a - 0”

如果这是一个愚蠢的问题,我很抱歉。

【问题讨论】:

  • 使用一些 Point 类,带有 hashCode() 和 equals(); int[] 中缺失。

标签: java for-loop hashmap


【解决方案1】:

Java 数组不提供对 equals 方法的覆盖,只会进行身份比较。

因此

new Integer[]{0,0}.equals(new Integer[]{0,0});

将返回 false 并且 Integer[] 根本不是一个可用作映射键的可用类,因为 HashMap 在内部为键使用 equals 和 hashcode 方法。

您应该考虑为包含这 2 个 int 值的键创建自己的自定义类,并在其中覆盖 equals 和 hashcode。

但是你可以使用 List 并且它应该可以工作:

HashMap<List<Integer>, Integer> testHashMap = new HashMap<>();
for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        List<Integer> someInteger = Arrays.asList(i, j);
        testHashMap.put(someInteger, (i + j * 4));
    }
}
List<Integer> someOtherInteger = Arrays.asList(0,0);
System.out.println("a - " + testHashMap.get(someOtherInteger));

会给你你想要的输出。

【讨论】:

    【解决方案2】:

    正如@vakio 解释的那样,数组的hashCode 不考虑它们的内容。

    如果您确实需要为地图使用复合键,请将Integer[] 键类型数组替换为列表List&lt;Integer&gt;

    Map<List<Integer>, Integer> testHashMap = new HashMap<>();
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            List<Integer> someInteger = Arrays.asList(i, j);
            testHashMap.put(someInteger, (i + j * 4));
        }
    }
    List<Integer> someOtherInteger = Arrays.asList(0, 0);
    System.out.println("a - " + testHashMap.get(someOtherInteger)); // a - 0
    

    【讨论】:

      【解决方案3】:

      请阅读here

      他说如下

      数组无法做到这一点,因为它们不会覆盖 equals() 和 hashCode()。您应该定义自己的类来包装数组,这将覆盖 equals() 和 hashCode() 或使用 List&lt;Integer&gt; 作为键。

      我要提醒你的是一样的。

      使用List&lt;Integer&gt; 而不是Integer[]

      【讨论】:

        【解决方案4】:

        在第一种情况下,对于整数数组,您作为地图键存储的内容通常是 {0,0} 或 {i,j} 的对象引用。

        当您创建 someOtherInteger 时,Java 会返回另一个对象引用 - 分配另一个内存地址。换句话说,每当 Java 创建一个新的对象,并且数组被认为是一个对象而不是一个原始对象时,它都会为它分配一个不同的地址。

        这就是为什么当调用 get 时,给第二个值,持有 someOtherInteger 数组引用,它返回 null。此键反映 someOtherInteger 的唯一地址,在您的地图中不存在。

        【讨论】:

          猜你喜欢
          • 2011-05-02
          • 1970-01-01
          • 1970-01-01
          • 2015-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多