简介
本文介绍创建HashMap并初始化一些成员的方法。
法1:匿名内部类
HashMap<String, String> map = new HashMap<String, String>() {{ put("name", "test"); put("age", "20"); }};
缺点
1.内存泄露隐患
非静态内部类/ 匿名内部类包含了外围实例的引用, 如果拥有比 外部类更长的生命周期,有内存泄露隐患。
2.如果这个对象要串行化,可能会导致串行化失败。
- 此种方式是匿名内部类的声明方式,所以引用中持有着外部类的引用。所以当时串行化这个集合时外部类也会被不知不觉的串行化,当外部类没有实现serialize接口时,就会报错。
- 上例中,其实是声明了一个继承自HashMap的子类。然而有些串行化方法,例如要通过Gson串行化为json,或者要串行化为xml时,类库中提供的方式,是无法串行化Hashset或者HashMap的子类的,从而导致串行化失败。
解决办法
重新初始化为一个HashMap对象:
HashMap<String, String> map = new HashMap<String, String>() {{ put("name", "test"); put("age", "20"); }}; HashMap<String, String> newMap = new HashMap(map);
这样就可以正常初始化了。
法2:静态方法
public class Demo{ private static final Map<String, String> myMap; static { myMap = new HashMap<String, String>(); myMap.put("a", "b"); myMap.put("c", "d"); } }
法3:第三方包Guava
Map<String, Integer> left = ImmutableMap.of("a", 1, "b", 2, "c", 3); //或者 Map<String, String> test = ImmutableMap.<String, String>builder() .put("k1", "v1") .put("k2", "v2") ... .build();
请先
!