HashMap containsKey returns false for Integer

HashMap containsKey returns false for Integer

我有这个简单的代码,我发现对于最后一个数组编号,containsKey 方法 returns 始终为 false。

int[] indices = new int[] { 1, 3, 5, 7, 9 };

Map<Integer, Integer> seen = new HashMap<>();

for (int i = 0; i < indices.length - 1; i++) {
    seen.put(indices[i], i);
}

除了:

,其他都为真
System.out.println("!!!!! " + seen.containsKey(9) );

还有新的

int[] { 1, 3, 5, 7 };

除了:

,其他都为真
System.out.println("!!!!! " + seen.containsKey(7) );

这背后的逻辑是什么?

您没有将 indices 数组的最后一个元素放入 Map

改变

for (int i = 0; i < indices.length - 1; i++) {
    seen.put(indices[i], i);
}

for (int i = 0; i < indices.length; i++) {
    seen.put(indices[i], i);
}

在for循环中

for (int i = 0; i < indices.length - 1; i++) 

将条件更改为 i <= indices.length - 1 或者其他选项是使用 i < indices.length

在您的代码中,您仅将数组的倒数第二个元素添加到地图中。

看看你的 for 循环:

for (int i = 0; i < indices.length - 1; i++) {

你的for循环中的条件是错误的。使用 < indices.length -1 您实际上只将前 4 个键放入地图中。它应该是

<= indices.length -1

< indices.length

用这个填充地图后:

    for (int i = 0; i < indices.length - 1; i++) {
        seen.put(indices[i], i);
    }

它看起来像:

    {1=0, 3=1, 5=2, 7=3}

所以你是在询问地图是否有值为 9 的键....

答案正确,没有....

因为在你的代码循环中从 0 开始,你的最后一个键是 (indices.length -1) .

似乎您没有添加最后一个元素,您的循环是 运行 直到小于长度 - 1。只需删除 -1

for (int i = 0; i < indices.length; i++) {
seen.put(indices[i], i);
}

或使用小于等于

for (int i = 0; i <= indices.length - 1; i++) {
seen.put(indices[i], i);
}

这不是 containsKey 的问题,get 也不会为您提供价值,因为永远不会添加最后一个元素。

我的两分钱:这是避免这些问题的功能版本:

int[] indices = new int[] {1, 3, 5, 7, 9};

Map<Integer, Integer> map = IntStream.range(0, indices.length)
         .mapToObj(i -> {
           return new int[] {i, indices[i]};
         })
         .collect(Collectors.toMap(i -> i[1], i -> i[0]));