java - Java 在 for 循环内的 hashmap 中放入一些东西
问题描述
嘿,我只想说我是一个 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));
输出:“a - null”输出应该是:“a - 0”
如果这是一个愚蠢的问题,我很抱歉。
解决方案
Java 数组不提供对 equals 方法的覆盖,只会进行身份比较。
为此
new Integer[]{0,0}.equals(new Integer[]{0,0});
将返回 false 并且 Integer[] 根本不是一个可用作映射键的可用类,因为 HashMap 在内部为键使用 equals 和 hashcode 方法。
您应该考虑为包含这 2 个 int 值的键创建自己的自定义类,并在其中覆盖等于和哈希码。
但是您可以使用 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));
会给你你想要的输出。
推荐阅读
- unity3d - LoadScene() 之后的 Unity 和照明和渲染无法正常工作
- python - 根据另一列的内容创建一个新列
- machine-learning - ELI5 包为 XGBoost 功能重要性产生所有正权重
- python - 将项目添加到 DynamoDB 表并将更改传播到 AWS Amplify
- c++ - std::variant duplicate type cause no suitable constructor error(clang-1300.0.29.3)
- typescript - 将数组转换为类型
- while-loop - While循环和条件满足
- typescript - 记录
缺少 CustomType 的属性 - python - KeyError 试图创建一个对其他列求和的新列
- google-chrome - 谷歌扩展 - GET/POST Api