商城首页欢迎来到中国正版软件门户

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

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

  发布于2026-07-09 阅读(0)

扫一扫,手机访问

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()(前提是元素本身可比较)。

几个必须警惕的坑