Collections.singleton()内存占用极小,因其返回内部静态类Collections$SingletonSet实例,仅持一个引用字段、无容量/哈希表/扩容机制,对象约16字节,不复制元素、无size字段、无同步开销。

Collections.singleton() 是 Java 中创建单元素不可变 Set 的最轻量方式,它不新建集合对象,而是返回一个内部静态类的实例,内存开销几乎为零。
为什么它内存占用极小
该方法不创建 ArrayList、HashSet 或其他常规集合结构。它返回的是 Collections$SingletonSet(JDK 内部私有静态类),内部仅持有一个引用字段(element),无容量、无哈希表、无扩容机制。
- 对象本身仅占约 16 字节(对象头 + 1 个引用字段,与 JVM 实现有关)
- 不复制元素,不维护额外元数据(如 size 字段,size 固定为 1)
- 所有 singleton Set 共享同一套不可变逻辑,无同步或防御性拷贝开销
基本用法与注意事项
直接传入元素即可,返回的 Set 支持 contains()、size()、iterator() 等只读操作,但调用 add()、remove() 等会立即抛出 UnsupportedOperationException。
Set<String> single = Collections.singleton("hello");
System.out.println(single.size()); // 1
System.out.println(single.contains("hello")); // true
single.add("world"); // 抛出 UnsupportedOperationException
- 元素可以为
null(Collections.singleton(null)合法) - 返回的 Set 是线程安全的(因不可变),无需额外同步
- 每次调用
singleton(x)都返回新对象,即使元素相同也不复用(不缓存)
对比其他常见方式
相比其他“单元素 Set”写法,singleton() 明显更省空间:
立即学习“Java免费学习笔记(深入)”;
-
Set.of("x")(Java 9+):功能等价,底层也高度优化,但引入了新不可变集合框架,对象结构稍复杂;在多数场景下内存差异可忽略,但singleton()更早可用且更精简 -
Collections.unmodifiableSet(new HashSet(Arrays.asList("x"))):创建了完整 HashSet(至少包含哈希表数组、size、modCount 等),内存占用是前者的 5–10 倍以上 -
new HashSet(Collections.singletonList("x")):同样冗余,还触发哈希计算和桶分配
适用场景建议
适合需要临时、轻量、只读单元素集合的场合:
- 作为方法参数传递(例如过滤条件:
someMethod(Collections.singleton(id))) - 在流操作中快速构造基准集合(
Stream.of(...).filter(x -> ALLOWED_SET.contains(x))) - 避免为单个值专门 new 一个 HashSet 或 LinkedHashSet
- 与枚举、常量搭配使用(
Collections.singleton(Status.ACTIVE))
不适用于需动态增删、或后续可能扩展为多元素的场景——此时应选 Set.of()(固定大小)或可变集合。


















