以HashMap为例:一般我们初始化集合的方法为:- HashMap<String, String> map =new HashMap<String, String>();
- map.put("Name", "June");
- map.put("QQ", "2572073701");
复制代码 文艺写法为:
- HashMap<String, String> map =new HashMap<String, String>() {
- {
- put("Name", "June");
- put("QQ", "2572073701");
- }
- };
复制代码 不难发现采用的是匿名类的形式:第一层括弧实际是定义了一个匿名内部类,第二层括弧实际上是一个实例初始化块这种写法.
在初始化 ArrayList、Set 的时候都可以这么玩:
- List<String> names = new ArrayList<String>() {
- {
- for (int i = 0; i < 10; i++) {
- add("A" + i);
- }
- }
- };
- System.out.println(names.toString()); // [A0, A1, A2, A3, A4, A5, A6, A7, A8, A9]
复制代码 文艺写法好处:可以提高代码的执行效率
弊端:如果这个对象要串行化,可能会导致串行化失败。因为此种方式是匿名内部类的声明方式,所以引用中持有着外部类的引用。 所以当串行化这个集合时外部类也会被不知不觉的串行化,当外部类没有实现serialize接口时,就会报错。
解决办法:重新初始化一个集合对象,如:new HashMap(map);
|