所以我正在编写一个编程挑战,我想存储超过128个<int, int>.
类型的键值对
由于HashMaps无法接受原语,因此我使用了<Integer, Integer
&gt;。我遇到了一个问题:
HashMap<Integer, Integer> map = new HashMap<Integer,Integer>();
Integer x = new Integer(130);
map.put(x, x);
稍后在我的代码中,我将需要从地图中检索的值计算为整数。我尝试使用以下方法检索它:
int calculated = 130;
Integer y = new Integer(calculated);
map.get(y)
这将导致NullPointerException,因为x和y的HashCode是不同的(这是预期的,因为Integer类仅在-128和127之间保留值的缓存)。
我的问题是,如果我想在Java中使用类似地图的结构存储大量键值对,我该怎么做?
[编辑]:谢谢大家的回复!在重构了我的一些逻辑后,问题不再存在(它不是整数本身的问题)。感谢您再次使用Java中的HashMaps表示感谢:)
答案 0 :(得分:4)
这将导致NullPointerException,因为x和y的HashCode是不同的(这是预期的,因为Integer类仅在-128和127之间保留值的缓存)。
这无关紧要。 Integer
会恰当地覆盖hashCode()
和equals()
,这是在HashMap
中查找不同对象所需的全部内容。 (两个相等Integer
值的哈希码将是相同的,即使它们不是相同的Integer
个对象。)
应该绝对没问题:
Map<Integer, Integer> map = new HashMap<>();
Integer x = 130;
Integer y = 130;
System.out.println(x == y); // False (on my machine)
map.put(x, 1000);
System.out.println(map.get(y)); // 1000
此外,只有map.get(y)
语句不会抛出NullPointerException
,除非map
或y
为null
...即使它可以&#39;找到一个匹配,它将返回null
,而不是抛出异常。
请注意,您不需要致电new Integer(...)
- 如果您这样做,那么盒装值的缓存无论如何都是无关紧要的。例如:
Integer a = new Integer(5);
Integer b = new Integer(5);
System.out.println(a == b); // False, always
Integer c = 5;
Integer d = 5;
System.out.println(c == d); // True, always, due to caching of small boxed values
答案 1 :(得分:-1)
这将导致NullPointerException
不,它不会赢,除非&#39; map&#39;是空的。
因为x和y的HashCode不同
不,他们不是。