collections.singletonlist() 创建不可修改且仅含一个元素的list,返回轻量级只读实例,支持查询操作但所有修改操作抛unsupportedoperationexception。

Collections.singletonList() 是 Java 提供的一个高效、轻量级的工具方法,用于快速创建一个**不可修改(immutable)且仅含一个元素**的 List。它返回的是内部优化的私有静态类实例,不占用额外数组空间,比 Arrays.asList() 或新建 ArrayList 更省内存。
基本用法:传入单个元素即可
该方法签名是:public static <t> List<t> singletonList(T o)</t></t>。只需传入你要封装的那个对象,无论类型(String、Integer、自定义对象等),都会返回一个只读列表:
-
✅ 正确示例:
List<string> single = Collections.singletonList("hello");</string>List<integer> numbers = Collections.singletonList(42);</integer> -
❌ 错误理解:不能传入数组或集合试图“展开”——它只接受一个参数,且整个数组会被当作一个元素放入列表中。
例如:Collections.singletonList(new String[]{"a","b"})得到的是一个含 1 个 String[] 元素的列表,不是含两个字符串的列表。
它是真正只读的:所有修改操作都会抛异常
返回的列表实现了 java.util.List 接口,但所有会改变结构的方法(如 add()、remove()、set()、clear())均直接抛出 UnsupportedOperationException:
-
single.add("world");→ 抛出异常 -
single.set(0, "hi");→ 抛出异常(即使索引合法) -
single.remove(0);→ 抛出异常 - 但
get(0)、size()、contains()、indexOf()等查询方法完全可用
适用场景与注意事项
- 适合用作方法返回值,明确表达“这里只提供一个结果”,避免调用方误改;
- 常用于构建默认配置、单例响应、测试桩(stub)数据;
- 注意:虽然列表不可变,但若元素本身是可变对象(如
StringBuilder),其内部状态仍可被修改——singletonList()不做深拷贝; - 如果需要多个元素的只读列表,应使用
Collections.unmodifiableList(Arrays.asList(...))或 Java 10+ 的List.of(...)。
对比其他常见方式
-
Arrays.asList("x"):返回固定大小列表,set()可行,add()/remove()抛异常 —— 不是完全只读; -
Collections.unmodifiableList(new ArrayList(Arrays.asList("x"))):功能等价但更重,多一次包装和数组分配; -
List.of("x")(Java 9+):更通用(支持多元素)、同样不可变,底层实现也高度优化,推荐在新项目中优先使用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











