看到了一段奇怪的初始化ArrayList并赋值的代码,类似于
ArrayList<String> list = new ArrayList<String>(){{
add("a");
add("b");
add("c");
}};
System.out.println(list);
就会输出[a, b, c]
我是第一次注意到有用 {{}} 的情形,不能理解,开始以为是黑科技,百度了一下发现原来如此。
如果是 new ArrayList<String>(){} 的形式,就是常见的匿名类。
现在两个大括号的写法,等于是在匿名类里加了一段代码块
new ArrayList<String>(){{}}
这一段代码会编译出一个带$名的class,其实约等于下面的
static class ListTemp extends ArrayList{
public ListTemp(){
super();
}
{
this.add("123");
}
}
...
System.out.println(new ListTemp());
执行结果一样会输出123
创建对象时先执行构造方法,再执行代码块里的内容。
写起来很省事,但用的多了会编译出很多带$的class文件。
详细解释可见这篇文章