我创建了一个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]
这种行为的原因是什么?
答案 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是一种数据结构,您可以在其中存储键值对。关键是独一无二的。否则,您将覆盖具有相同密钥的值。在你的情况下,你所有的钥匙都是独一无二的,所以我不认为你会得到错误的输出。