Java 将某些内容放入 for 循环内的哈希图中
Java put something in a hashmap inside a for loop
嘿,我只是想说我是 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 - 空”
outPut 应该是:“a - 0”
如果这是一个愚蠢的问题,我很抱歉。
Java 数组不提供对 equals 方法的覆盖,只会进行身份比较。
因此
new Integer[]{0,0}.equals(new Integer[]{0,0});
will return false 并且 Integer[] 根本不是可用的 class 用作映射的键,因为 HashMap 在内部使用 equals 和 hashcode 方法作为键。
您应该考虑为保存这 2 个 int 值的键创建您自己的自定义 class,并在其中覆盖 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));
会给你想要的输出。
请阅读here
他说如下
No way to do that with arrays, because they don't override equals() and hashCode(). You should define your own class wrapping the array, which would override equals() and hashCode() or use a List<Integer>
as key instead.
我要提醒你的是一样的。
使用 List<Integer>
而不是 Integer[]
。
正如@vakio 所解释的,hashCode
数组没有考虑它们的内容。
如果您确实需要为地图使用复合键,请将 Integer[]
键类型数组替换为列表 List<Integer>
:
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
在第一种情况下,对于整数数组,您存储为地图键的内容通常是 {0,0} 或 {i,j} 的对象引用。
当您创建 someOtherInteger 时,Java 返回另一个对象引用 - 分配另一个内存地址。换句话说,每当 Java 创建一个新的对象,并且数组被认为是一个对象而不是原始类型时,它会为其分配一个不同的地址。
这就是为什么当调用 get
给出第二个值时,持有 someOtherInteger 数组引用,它 returns 为空。此键反映了 someOtherInteger 的唯一地址,在您的地图中不存在。
嘿,我只是想说我是 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 - 空” outPut 应该是:“a - 0”
如果这是一个愚蠢的问题,我很抱歉。
Java 数组不提供对 equals 方法的覆盖,只会进行身份比较。
因此
new Integer[]{0,0}.equals(new Integer[]{0,0});
will return false 并且 Integer[] 根本不是可用的 class 用作映射的键,因为 HashMap 在内部使用 equals 和 hashcode 方法作为键。
您应该考虑为保存这 2 个 int 值的键创建您自己的自定义 class,并在其中覆盖 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));
会给你想要的输出。
请阅读here
他说如下
No way to do that with arrays, because they don't override equals() and hashCode(). You should define your own class wrapping the array, which would override equals() and hashCode() or use a
List<Integer>
as key instead.
我要提醒你的是一样的。
使用 List<Integer>
而不是 Integer[]
。
正如@vakio 所解释的,hashCode
数组没有考虑它们的内容。
如果您确实需要为地图使用复合键,请将 Integer[]
键类型数组替换为列表 List<Integer>
:
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
在第一种情况下,对于整数数组,您存储为地图键的内容通常是 {0,0} 或 {i,j} 的对象引用。
当您创建 someOtherInteger 时,Java 返回另一个对象引用 - 分配另一个内存地址。换句话说,每当 Java 创建一个新的对象,并且数组被认为是一个对象而不是原始类型时,它会为其分配一个不同的地址。
这就是为什么当调用 get
给出第二个值时,持有 someOtherInteger 数组引用,它 returns 为空。此键反映了 someOtherInteger 的唯一地址,在您的地图中不存在。