展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > 怎么利用 Collections.nCopies() 快速生成包含海量重复变量的只读视图以节省内存

怎么利用 Collections.nCopies() 快速生成包含海量重复变量的只读视图以节省内存

Ja va里需要快速生成大量重复元素时,很多人的第一反应可能是用for循环往ArrayList里加。但有没有想过,如果只是为了占个位置、设置个默认值,或者构建测试数据,完全不用真的在内存里复制那么多份对象?Collections.nCopies() 就是为此而生的一个轻量工具。 核心机制:一份引用,

本文目录

    Ja va里需要快速生成大量重复元素时,很多人的第一反应可能是用for循环往ArrayList里加。但有没有想过,如果只是为了占个位置、设置个默认值,或者构建测试数据,完全不用真的在内存里复制那么多份对象?Collections.nCopies() 就是为此而生的一个轻量工具。

    核心机制:一份引用,假装有n个

    先理解它的内存节省原理。nCopies() 返回的不是ArrayList或LinkedList,而是一个叫做 CopiesList 的私有内部类。它内部只存了三个东西:一个是对被复制元素的引用(element),一个是你指定的数量(n),还有一个懒加载的hashCode。也就是说,无论你让nCopies生成100个元素还是一百万个元素,它在内存里占用的空间几乎不变——因为根本没有真正创建那n个副本,所有逻辑位置都指向同一个实例。打个比方,它就像一个“数字占位符”,只告诉你这里该有这么多相同的元素,但实际只有一个原件。

    当然,代价也很明显:它返回的是一个只读视图。不支持add、remove、set这类修改操作,一旦尝试调用这些方法,就会毫不客气地抛出 UnsupportedOperationException。

    什么时候用它最顺手?

    • 填充默认值:比如给一千个新用户统一分配“USER”角色,一行代码搞定:
    List defaultRoles = Collections.nCopies(1000, "USER");
    • 轻量构造海量初始数据:如果需要一个包含一百万个零的列表,直接:
    List zeros = Collections.nCopies(1_000_000, 0);

    这一个List对象占用的内存大约是24个字节左右,而不是你以为的四兆(4MB)。

    • 作为不可变占位符参与集合操作:比如传给 Collections.frequency() 计算出现次数,或者用于 Collections.binarySearch()(前提是元素本身可比较)。

    几个必须警惕的坑