Java中HashMaps的用处

时间:2014-09-30 05:46:13

标签: java data-structures

所以我正在编写一个编程挑战,我想存储超过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表示感谢:)

2 个答案:

答案 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,除非mapynull ...即使它可以&#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不同

不,他们不是。