为什么hashmap项的顺序会改变?

时间:2013-05-20 05:56:58

标签: java-ee struts2

我在界面中使用以下代码,一旦结果显示在浏览器上,值的顺序就会改变。如何解决问题?

   public static final Map<String,String> BED = new HashMap<String,String>(){
        {
            put("A","Any");
            put("0","Studio");
            put("1","1 or more");
            put("2","2 or more");
            put("4","4 or more");


    };
    };


<s:select name="BED" label="Bedrooms" list="@interfaces.Items@BED"/>
浏览器中的

顺序如下

 1 or more
 Studio
 Any 
 4 or more

2 个答案:

答案 0 :(得分:1)

Hashmap不是有序集合。

因此,如果您根据用例更改为TreeMap或LinkedHashMap,那么您将以有序的方式获得结果。

来自Java Tutorial

  

Java平台包含三个通用的Map实现:HashMap,TreeMap和LinkedHashMap。它们的行为和性能完全类似于HashSet,TreeSet和LinkedHashSet,如Set Interface section中所述。

设置接口部分:

  

Java平台包含三个通用的Set实现:HashSet,TreeSet和LinkedHashSet。将其元素存储在哈希表中的HashSet是性能最佳的实现;但它不能保证迭代的顺序。 TreeSet将其元素存储在红黑树中,根据其值对其元素进行排序;它比HashSet慢得多。 LinkedHashSet实现为一个哈希表,其中包含一个链表,它根据它们插入集合(插入顺序)的顺序对其元素进行排序。 LinkedHashSet使其客户端免受HashSet提供的未指定的,通常是混乱的排序,其成本仅稍高一些。

答案 1 :(得分:1)

使用LinkedHashMap代替

public static final Map<String,String> BED = new LinkedHashMap<String,String>();

<强>参考
http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html

  

这个实现与HashMap的不同之处在于它维护着一个运行所有条目的双向链表。此链接列表定义迭代排序,这通常是将键插入到地图中的顺序(插入顺序)。