【问题标题】:initializing static Map of ArrayList初始化 ArrayList 的静态 Map
【发布时间】:2014-10-14 05:04:33
【问题描述】:

我想定义一个 ArrayList 的静态 Map 以包含成对的 [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") 是消除警告的正确方法还是有更好的方法?

【问题讨论】:

  • 再次检查导入com.google.common.collect.ImmutableMap;是GWT项目吗?
  • 我认为您正在寻找 UnmodifiableMap。
  • 我已将 jar 文件 guava-10.0.1.jar 添加到我的库中。

标签: java arraylist map static initialization


【解决方案1】:

改变-

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();

【讨论】:

    【解决方案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?

    我怀疑您使用 ImmutableMap 的方式存在另一个问题,但我不明白您的问题,因此无法对此发表评论。你能改写你的问题的介绍吗?

    【讨论】:

    • 感谢您的两个回答。对于第一个问题,您的评论与@ThelostMind 的答案一样有效。
    猜你喜欢
    • 1970-01-01
    • 2013-12-13
    • 2016-01-08
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2013-03-19
    相关资源
    最近更新 更多