插入先前存储的值的HashMap已被覆盖

时间:2015-10-19 10:37:46

标签: java hashmap

我创建了一个HashMap,当试图在大于地图大小的位置插入值时,先前存储的值已被覆盖并丢失。

Map<Integer, String> myTestObj = new HashMap<Integer,String>();

myTestObj.put(0,"zero");
myTestObj.put(1,"one");
myTestObj.put(2,"two");
myTestObj.put(3,"three");
myTestObj.put(13,"thirteen");
myTestObj.put(14,"fourteen");
myTestObj.put(15,"fifteen");

myTestObj.put(16,"sixteen");
myTestObj.put(17,"senventeen");

哈希地图内容

实际输出:

[17 = senventeen,16 = 16,2 = two,3 = 3,null,null,null,null,null,null,null,null,null,13 = 13,14 = 14,15 = 15]

预期输出 [0 = 0,1 = 1,2 = 2,3 = 3,null,null,null,null,null,null,null,null,null,13 =十三,14 =十四,15 =十五,16 =十六,17 = senventeen]

这种行为的原因是什么?

2 个答案:

答案 0 :(得分:1)

我认为您使用System.out.println(myTestObj)或类似的东西来显示地图。

在这种情况下,您依靠HashMap.toString()格式化对象,并且以自然迭代顺序格式化条目。问题是HashMap的自然迭代顺序没有定义。

如果您希望按键上的返回/显示地图条目,请使用TreeMap。如果您希望地图保留广告订单,请使用LinkedHashMap

  

插入先前存储的值的HashMap已被覆盖

它们不会被覆盖。或者至少,不是在你向我们展示的代码中。

发生的事情是它们的显示顺序与插入顺序的顺序不同...这与HashMap 无序地图的规范一致。

记录:

[stephen@blackbox tmp]$ cat Test.java 
import java.util.*;

public class Test {
    public static void main(String[] args) {
        Map<Integer, String> myTestObj = new HashMap<Integer,String>();

        myTestObj.put(0,"zero");
        myTestObj.put(1,"one");
        myTestObj.put(2,"two");
        myTestObj.put(3,"three");
        myTestObj.put(13,"thirteen");
        myTestObj.put(14,"fourteen");
        myTestObj.put(15,"fifteen");

        myTestObj.put(16,"sixteen");
        myTestObj.put(17,"senventeen");

        System.out.println(myTestObj);
    }
}

[stephen@blackbox tmp]$ javac Test.java 
[stephen@blackbox tmp]$ java Test
{0=zero, 16=sixteen, 1=one, 17=senventeen, 2=two, 3=three, 13=thirteen, 14=fourteen, 15=fifteen}
[stephen@blackbox tmp]$ 

结论:如果对象真的被覆盖或删除,那是因为你没有向我们展示过一些代码。

答案 1 :(得分:1)

我已经执行了你的代码,我得到了以下输出: {17=senventeen, 0=zero, 16=sixteen, 1=one, 2=two, 3=three, 13=thirteen,14=fourteen, 15=fifteen}

HashMap是一种数据结构,您可以在其中存储键值对。关键是独一无二的。否则,您将覆盖具有相同密钥的值。在你的情况下,你所有的钥匙都是独一无二的,所以我不认为你会得到错误的输出。

相关问题