初始化ArrayList的静态Map

时间:2014-08-20 18:03:09

标签: java arraylist map static initialization

我想定义一个静态Map的ArrayList,以包含一对[key,ArrayList object]的

在这些时间段中有很多要添加的东西,但它们在每次执行时都是固定的。因此,在定义arrayList 的映射时,最好的方法是初始化。

我可以通过静态方法执行此操作,包括:

arrayList.add("value1"), 
arrayList.add("value2"), 
arrayList.add("value3"),
... 

然后:

map.put("key", arrayList)

然而,对于每对[key,ArrayList],这些必须重复

我尝试了 ImmutableMap ,但收到了此错误:

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
    at bugTriaging.Constants.<clinit>(Constants.java:11)

这是我的代码:

package package1;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import com.google.common.collect.ImmutableMap;

public class Constants { 
    static final Map<String, ArrayList<String>> map1 = ImmutableMap.<String, ArrayList<String>>builder()
            .put("key1", (ArrayList<String>) Arrays.asList("value1", "value2", "value3"))
            .put("key2", (ArrayList<String>) Arrays.asList("value4", "value5", "value6", "value7"))
            .put("key3", (ArrayList<String>) Arrays.asList("value8", "value9", "value10", "value11", "value12", "value13"))
            .build();

    public static void main(String[] args) {
        System.out.println("Started ...");
    }
}

我玩过静态和最终值,但无法运行它。

最后,我可以运行此代码:

    @SuppressWarnings("serial") //to avoid the warning.
    public static HashMap<String, ArrayList<String>> map2 = new HashMap<String, ArrayList<String>>() {{
        put("key1", new ArrayList<String>() {{
            add("value1");
            add("value2");
          }});
        put("key2", new ArrayList<String>() {{
            add("value3");
            add("value4");
            add("value5");
          }});
        put("key3", new ArrayList<String>() {{
            add("value6");
            add("value7");
            add("value8");
          }});
    }};

以下是我的问题:

  

1-我的第一种方法中ImmutableMap的问题是什么?

     

2-使用我的解决方案,我收到警告(“可序列化类不会声明类型为long的静态最终serialVersionUID字段”)。添加 @SuppressWarnings(“serial”)正确摆脱警告的方式还是有更好的方法?

2 个答案:

答案 0 :(得分:4)

改变 -

static final Map<String, ArrayList<String>> map1 = ImmutableMap.<String, ArrayList<String>>builder() 

static final Map<String, List<String>> map1 = ImmutableMap.<String, List<String>>builder()

为什么?

Arrays.asList()会返回不同的ArrayList而不是java.util.List。返回的ArrayList是Arrays类中的静态内部类。


完成初始化:

static final Map<String, List<String>> map1 = ImmutableMap
        .<String, List<String>> builder()
        .put("key1", Arrays.asList(new String[] { "value1", "value2", "value3" }))
        .put("key2", Arrays.asList(new String[] { "value4", "value5", "value6", "value7" }))
        .put("key3",Arrays.asList(new String[]  { "value8", "value9", "value10", "value11", "value12", "value13" })).build();

答案 1 :(得分:2)

  1. ClassCastException来自第11行,您将返回的对象从Arrays.asList()转换为ArrayList。问题是Arrays.asList()返回List类型的对象(参见http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html),而List不是ArrayList的子类型。因此,要解决此问题,您可以将Map中存储的值更改为List,也可以手动构建ArrayLists,而不是使用Arrays.asList()。

  2. 如果您没有序列化任何内容,那就没关系。请参阅What does it mean: The serializable class does not declare a static final serialVersionUID field?

  3. 我怀疑你使用ImmutableMap的方式存在另一个问题,但我不明白你的问题所以我不能对此发表评论。你能改写一下你的问题吗?