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

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

ArrayList 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 list = debugListTest.getList();
    }

    List getList() {
        ArrayList list = new ArrayList<>() {{
            add(1);
            add(2);
        }};
        return list;
    }
}

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

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

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

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

Original: https://www.cnblogs.com/bingmous/p/16000579.html
Author: Bingmous
Title: java使用两对大括号添加集合元素的问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/684234/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • PHP PDO函数库详解

    PDO是一个”数据库访问抽象层”,作用是统一各种数据库的访问接口,与mysql和mysqli的函数库相比,PDO让跨数据库的使用更具有亲和力;与ADODB和…

    技术杂谈 2023年6月1日
    084
  • 【SSM框架】Spring笔记 – 事务详解

    1、Spring的事务管理: 事务原本是数据库中的概念,在实际项目的开发中,进行事务的处理一般是在业务逻辑层, 即 Service 层。这样做是为了能够使用事务的特性来管理关联操作…

    技术杂谈 2023年7月10日
    086
  • 移动端首屏优化?

    按需加载配合webpack分块打包, 通过entry和commonChunkPlugin 压缩图片 https://tinypng.com/ Original: https://w…

    技术杂谈 2023年5月31日
    067
  • 回溯法:数组总和III

    题目 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:只使用数字1到9每个数字 最多使用一次返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任…

    技术杂谈 2023年7月23日
    063
  • PyQt5中线程和界面操作总结

    界面及功能完成后,点击某个按钮操作耗时的操作时(比如打包大文件),点击按钮后执行打包,于是在真正打包完成前,界面界面都是呈现卡住的,无法动弹,稍微操作一下时可能不会遇到停止等待。 …

    技术杂谈 2023年7月11日
    075
  • canvaskit默认字体更改

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/bigben0123/p/15213977.htmlAu…

    技术杂谈 2023年5月31日
    089
  • Https是否加密URL参数和Header中的信息?(转载)

    HTTPS 会加密 header 和 body,而 URL 中 hostname 之后的部分是存在于 header 中的。 但注意 hostname 一般是会被明文传送的,因为 S…

    技术杂谈 2023年5月31日
    0101
  • [转]EVE-NG中使用SecureCRT合并tab标签

    在EVE-NG中双击设备使用SecureCRT对设备进行调试连接时,会出现每次连接不同设备时都会打开一个新的SecureCRT窗口,而不是在一个窗口中添加一个新的标签页,这就会导致…

    技术杂谈 2023年7月24日
    073
  • 最长公共子序列

    题目链接 P1439LIS(Longest Increasing Subsequence)(最长递增子序列)LCS(Longest Common Subsequence)(最长公共…

    技术杂谈 2023年7月11日
    078
  • 十分钟学会Golang开发gRPC服务

    gRPC是Google发起的一个开源RPC框架,使用HTTP/2传输协议,使用Protocol Buffers编码协议,相比RESTful框架的程序性能提高不少,而且当前流行的编程…

    技术杂谈 2023年7月11日
    065
  • 如何验收安卓PCBA主板的质量和性能

    .版本:v0.1作者:河东西望日期:2022-7-15. 对很多安卓智能设备厂商来说,他们的通用开发模式一般是:ODM/OEM设计开发主板PCBA(包括BSP驱动、原生AOSP系统…

    技术杂谈 2023年6月21日
    096
  • RedisSCAN命令

    获取指定前缀的key 需求描述: Redis中有大量以xxx开头的key,在不使用keys命令的情况下,如何快速获取这些前缀的key 解决方案: redis自带的scan命令可以解…

    技术杂谈 2023年7月24日
    064
  • 高精度PTP时钟服务器(PTP网络时钟同步)技术参数书

    高精度PTP时钟服务器(PTP网络时钟同步)技术参数书 高精度PTP时钟服务器(PTP网络时钟同步)技术参数书 京准电子科技官微——ahjzsz 一、PTP网络时钟服务器产品概述 …

    技术杂谈 2023年6月21日
    0106
  • Idea运行HelloWorld与Idea自用设置

    Java运行机制 编译型compile:操作系统等需要速度的会使用编译型去做(全局翻译再运行) 解释型:网页,服务器脚本等对速度没有要求的使用解释型做(运行一句解释一句) 程序运行…

    技术杂谈 2023年6月21日
    0119
  • requests上传文件进度条

    python;gutter:true; import os import requests</p> <p>class ChunkIO:</p> …

    技术杂谈 2023年6月21日
    064
  • 关于code review

    关于code review背景:我们组是属于技术平台,后端一共就4个研发,主要是给整个部门提供基础库,以及解决方案,所以代码量不多,对代码要求质量比较高,组内成员整体水平也比较高,…

    技术杂谈 2023年5月31日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球