1.我们使用map.put();时换另一种写法:
HashMap<String, Object> hashMap3 = new HashMap<String, Object>() {{
put("ARK_OOP",7);
put("CTR_URL",8);
put("LPK_NNM",9);
}};
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>(){{
add(hashMap1);
add(hashMap2);
add(hashMap3);
}};
为什么可以这样写?:
public class Test {
/*private static HashMap< String, String> map = new HashMap< String, String>() {
{
put("Name", "June");
put("QQ", "2572073701");
}
};*/
public Test() {
System.out.println("Constructor called:构造器被调用");
}
static {
System.out.println("Static block called:静态块被调用");
}
{
System.out.println("Instance initializer called:实例初始化块被调用");
}
public static void main(String[] args) {
new Test();
System.out.println("=======================");
new Test();
}
}
输出:
Static block called:静态块被调用
Instance initializer called:实例初始化被调用
Constructor called:构造器被调用
=======================
Instance initializer called:实例初始化被调用
Constructor called:构造器被调用
即new HashMap(){ //匿名类
{//TODO} //实例初始化块
}
参考:new HashMap(){{put("id", "001");}}的解释_只作为个人备忘录-CSDN博客
------
2021/10/11更新:
4. 使用双花括号初始化的优点
使用双花括号有一些简单的优点:
- 与本地创建和初始化方式相比,代码行更少
- 代码更具可读性
- 创建初始化在同一表达式中完成
5. 使用双花括号初始化的缺点
使用双花括号的缺点:
- 模糊,不是广为人知的初始化方式
- 每次我们使用它时都会创建一个额外的类
以及网上的生成一千万个对象或者集合啥的效率问题,我测了下,都是骗子。
还有说引用导致内存泄漏的,篇幅一模一样,我是蚌埠住了。看我的另一篇:
匿名内部类引用外部类对象是可以的且并不一定需要final及内部类引用外部类为私有时编译器会为其开“后门”_cc1aymore的博客-CSDN博客