在Java中如何使用Collections.nCopies生成重复元素集合

来源:菜鸟站长作者:南京网站建设头衔:草根站长
导读:本期聚焦于小伙伴创作的《在Java中如何使用Collections.nCopies生成重复元素集合》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《在Java中如何使用Collections.nCopies生成重复元素集合》有用,将其分享出去将是对创作者最好的鼓励。

在Java开发中,生成包含重复元素的集合是常见需求,Collections类的nCopies方法可以快速实现这个目的,它位于java.util包下,是专门用来创建包含指定数量重复元素的不可变列表的工具方法。

在Java中如何使用Collections.nCopies生成重复元素集合

Collections.nCopies方法基本定义

首先来看nCopies方法的源码定义,它的声明如下:

// 该方法接收两个参数,第一个是生成的元素数量,第二个是要重复的元素对象
// 返回一个不可变的List,包含n个重复的obj元素
public static <T> List<T> nCopies(int n, T obj)

方法的两个参数分别是int n表示要生成的元素个数,T obj表示要重复的元素对象,返回的是一个不可修改的List集合。

基础使用示例

下面通过一个简单的示例演示nCopies的基本使用,生成包含3个重复字符串的列表:

import java.util.Collections;
import java.util.List;

public class NCopiesDemo {
    public static void main(String[] args) {
        // 生成包含3个"test"字符串的列表
        List<String> repeatList = Collections.nCopies(3, "test");
        // 打印列表内容
        System.out.println(repeatList);
        // 打印列表长度
        System.out.println(repeatList.size());
    }
}

运行上述代码,输出结果如下:

[test, test, test]
3

nCopies返回集合的特性

需要特别注意,nCopies方法返回的列表是不可变的,不支持添加、删除、修改元素操作,尝试修改会抛出UnsupportedOperationException异常:

import java.util.Collections;
import java.util.List;

public class NCopiesModifyDemo {
    public static void main(String[] args) {
        List<String> repeatList = Collections.nCopies(2, "hello");
        // 尝试添加元素,会抛出异常
        try {
            repeatList.add("world");
        } catch (UnsupportedOperationException e) {
            System.out.println("添加元素失败:" + e.getMessage());
        }
        // 尝试修改元素,会抛出异常
        try {
            repeatList.set(0, "new");
        } catch (UnsupportedOperationException e) {
            System.out.println("修改元素失败:" + e.getMessage());
        }
    }
}

另外,nCopies返回的列表并不会实际存储n个元素的副本,它只是在每次访问元素时返回传入的obj对象,因此如果obj是可变对象,修改该对象会影响到列表中所有元素:

import java.util.Collections;
import java.util.List;

class User {
    private String name;

    public User(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return name;
    }
}

public class NCopiesMutableDemo {
    public static void main(String[] args) {
        User user = new User("初始名称");
        List<User> userList = Collections.nCopies(2, user);
        // 修改原始对象
        user.setName("修改后名称");
        // 列表中的元素也会跟着变化
        System.out.println(userList);
    }
}

上述代码运行后输出为[修改后名称, 修改后名称],这是因为列表中的元素都是同一个user对象的引用。

常见使用场景

1. 初始化固定长度的默认值列表

当需要创建一个固定长度、所有元素都是默认值的列表时,nCopies非常方便:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class InitListDemo {
    public static void main(String[] args) {
        // 生成10个默认值为0的Integer列表,再转为可变的ArrayList
        List<Integer> defaultList = new ArrayList<>(Collections.nCopies(10, 0));
        // 后续可以正常修改这个列表
        defaultList.set(0, 1);
        System.out.println(defaultList);
    }
}

2. 批量填充集合元素

在需要批量给集合填充相同元素时,可以结合addAll方法使用:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class FillListDemo {
    public static void main(String[] args) {
        List<String> targetList = new ArrayList<>();
        // 批量添加5个"default"元素到目标列表
        targetList.addAll(Collections.nCopies(5, "default"));
        System.out.println(targetList);
    }
}

与其他生成重复元素方式的对比

实现方式优点缺点
Collections.nCopies代码简洁,无需循环,内存占用低(不可变列表不存储实际副本)返回列表不可变,传入可变对象时需要注意引用问题
for循环手动添加可生成可变列表,逻辑灵活代码冗余,需要写循环逻辑
Arrays.fill填充数组后转列表可操作数组,适合数组场景转成列表后可能存在不可变问题,步骤更多

使用注意事项

  • 传入的n参数不能是负数,否则会抛出IllegalArgumentException异常
  • 如果需要可变的重复元素列表,需要把nCopies的结果作为构造参数传入ArrayList等可变集合
  • 如果重复的元素是可变对象,修改对象会影响列表中所有元素,需要根据需求判断是否适合使用这种方式
总结来说,Collections.nCopies是生成重复元素集合的高效工具,只要理解它的不可变特性和引用机制,就能在合适的场景中合理使用,减少冗余代码。

JavaCollections.nCopies重复元素集合List生成修改时间:2026-06-18 01:45:43

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。