bingmous

欢迎交流,不吝赐教~

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

java使用两对大括号添加集合元素的问题

目录

    使用两对大括号实际上是创建了一个内部类,并在内部类内部使用代码块的方式在创建对象的时候进行初始化

    ArrayList<Integer> list = new ArrayList<>(){{
    add(1);
    add(2);
    }};

    这样写看似优雅,其实有非常大的隐患,我们都知道,内部类对象的创建是依托于外部类对象的,在这个内部类对象里面会持有外部类对象的引用,当把这个list传递给外部使用的时候,这个list所在的类的对象是没有办法垃圾回收的,进而造成内存泄漏。

    举例说明:

    public class DebugListTest {
    private String name;
    public static void main(String[] args) {
    DebugListTest debugListTest = new DebugListTest();
    List<Integer> list = debugListTest.getList();
    }
    List<Integer> getList() {
    ArrayList<Integer> list = new ArrayList<>() {{
    add(1);
    add(2);
    }};
    return list;
    }
    }

    将上面代码编译后会多出来一个DebugListTest$1.class,反编译以后如下

    class DebugListTest$1 extends ArrayList<Integer> {
    DebugListTest$1(DebugListTest var1) {
    this.this$0 = var1;
    this.add(1);
    this.add(2);
    }
    }

    可以看到它把外层对象作为构造器参数传递给了this$0,也就是说这个内部类对象拿着创建这个内部类对象的外部类对象的引用。

    其次,多了一个内部类就多了一个.class文件,也就是多了一个类型,类加载器加载后维护这个类型也无疑增加了不必要的负担。

    参考:https://www.cnblogs.com/wenbronk/p/7000643.html

    posted on   Bingmous  阅读(201)  评论(0编辑  收藏  举报

    相关博文:
    阅读排行:
    · DeepSeek 开源周回顾「GitHub 热点速览」
    · 物流快递公司核心技术能力-地址解析分单基础技术分享
    · .NET 10首个预览版发布:重大改进与新特性概览!
    · AI与.NET技术实操系列(二):开始使用ML.NET
    · 单线程的Redis速度为什么快?
    点击右上角即可分享
    微信分享提示