Java 插入以前存储的值时的HashMap被重写

Java 插入以前存储的值时的HashMap被重写,java,hashmap,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"

我创建了一个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=senventen,16=16,2=2,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,null,13=13,14=14,15=15,16=16,17=senventen]

这种行为的原因是什么?

我猜您使用System.out.printlnmyTestObj或类似的工具来显示地图

在这种情况下,您依赖HashMap.toString来格式化对象,这就是按照自然迭代顺序格式化条目。问题是HashMap的自然迭代顺序没有定义

如果希望返回/显示地图条目,并在键上进行排序,则使用树形图。如果希望映射保留插入顺序,请使用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]$ 

结论:如果对象确实被覆盖或删除,那是因为您没有向我们展示某些代码。

我已经执行了您的代码,并得到以下输出: {17=senventen,0=0,16=16,1=1,2=2,3=3,13=13,14=14,15=15}


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

您的代码按预期工作。我怀疑你有一些乱码。你如何打印实际输出?@user2900314不,你没有。发布的代码中没有打印地图的内容,因此不会生成任何输出。张贴一个完整的例子,再现问题。我必须能够复制您的代码,将其粘贴到我的IDE中,按run,然后重新生成问题。@user2900314我最后用System.out.printlnmyTestObj测试了您的代码,它打印出我{0=0,16=16,1=1,17=Senventen,2=2,3=3,13,14=14,15}当我用Java 8运行它时,{17=senventen,0=0,16=16,1=1,2=2,3=3,13=13,14=14,15=15}使用Java 7和{17=senventen,0=0,16=16,1=1,2=2,3=3,13=13,14=14,15=15}结论:调试器有问题……或者应用程序的其他部分在调试器背后更新了映射。这与插入顺序无关。问题在于缺少的值0、0和1,1。我不相信正在发生的元素确实丢失了。如果是的,那要么是线程问题,要么是他的程序的其他部分正在删除对象。事实上,我正在为我的工作查看一大块代码,并对其进行调试。在调试变量中,它是这样显示的。我尝试复制与示例问题相同的内容,并在调试中看到相同的结果。但当我打印出结果如预期。抱歉浪费您的时间。