原文网址:Java之HashMap系列--创建并初始化成员的方法_IT利刃出鞘的博客-CSDN博客
简介
本文介绍创建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();