为什么HashMap的toString函数用不同的顺序打印自己?

unm*_*dio 11 java hashmap tostring

我有这个非常简单的代码,我只想尝试在Map中使用不同类型的对象.

//There's a bit of spanish, sorry about that
//just think 'persona1' as an object with
//a string and an int
Map mapa = new HashMap();
mapa.put('c', 12850);
mapa.put(38.6, 386540);
mapa.put("Andrés", 238761);
mapa.put(14, "Valor de 14");
mapa.put("p1", persona1);
mapa.put("Andrea", 34500);

System.out.println(mapa.toString());
Run Code Online (Sandbox Code Playgroud)

然后我期望从控制台的东西:

{c=12850, 38.6=386540, Andrés=238761, 14=Valor de 14, p1={nombre: Andres Perea, edad: 10}, Andrea=34500}
Run Code Online (Sandbox Code Playgroud)

但令我惊讶的是,我得到了不同顺序的相同数据:

{38.6=386540, Andrés=238761, c=12850, p1={nombre: Andres Perea, edad: 10}, Andrea=34500, 14=Valor de 14}
Run Code Online (Sandbox Code Playgroud)

如果我尝试其他类型的对象并不重要,即使只是字符串或数字类型,它总是这样做,它会产生一种不同的,没有任何明显的任何意义顺序.

有人能给我一个提示,为什么会这样?或者可能是一个太明显我错过的东西?

我正在使用Java 1.7和Eclipse Juno.

Vim*_*era 20

根据Oracle的文档

HashMap类大致相当于Hashtable,除了它是不同步的并且允许空值.这个类不保证地图的顺序; 特别是,它不保证订单会随着时间的推移保持不变.

请参阅HashMap JavaDocs.

  • 我想我先在这里试过,因为在我以为没有人问过之前.下次我会先看看文档,谢谢! (3认同)

Anu*_*Jha 16

在java中有3个实现map接口的类.1. hashMap:Id不保证任何订单.2.链接的HashMap:它将按插入顺序存储它们.3. TreeMap:它将按升序存储.(ASCII值)

因此,根据您的要求,您可以使用Linked HashMap而不是HashMap.so而不是写入

Map mapa = new HashMap();
Run Code Online (Sandbox Code Playgroud)

创建Linked HashMap的对象

Map mapa = new LinkedHashMap();
Run Code Online (Sandbox Code Playgroud)

请点击以下链接获取更多信息.

http://docs.oracle.com/javase/tutorial/collections/interfaces/map.html


Ruc*_*era 5

HashMap不保证元素的顺序。如果你想保持顺序使用LinkedHashMap

参见以下案例

    Map<Integer,String> unOrderedMap=new HashMap<>();
    unOrderedMap.put(1,"a");
    unOrderedMap.put(3,"a");
    unOrderedMap.put(2,"a");
    System.out.println("HashMap output: "+unOrderedMap.toString());

    Map<Integer,String> orderedMap=new LinkedHashMap<>();
    orderedMap.put(1,"a");
    orderedMap.put(3,"a");
    orderedMap.put(2,"a");
    System.out.println("LinkedHashMap output: "+orderedMap.toString());
Run Code Online (Sandbox Code Playgroud)

输出:

   HashMap output: {1=a, 2=a, 3=a}
   LinkedHashMap output: {1=a, 3=a, 2=a}
Run Code Online (Sandbox Code Playgroud)