用 ArrayList(set) 构造函数转 Set 最快最直接,时间复杂度 O(n),避免手动遍历、Stream 或 Arrays.asList 等低效方式,注意 null 和代理集合等边界问题。
用
构造函数转
最快也最直接
只要不涉及去重或排序,
是首选。它底层调用
,时间复杂度 O(n),没有额外对象创建开销。
常见错误是误以为需要手动遍历:
——这不仅啰嗦,还可能因迭代顺序问题导致测试不稳定(比如
无序)。
适用于所有
实现,包括
、
、
转出的
保留插入顺序;
保留自然/比较器顺序
如果
为
,会抛
,需提前判空
用
收集器适合带过滤或映射的场景
纯转类型不用
。只有当你顺手要干点别的事,比如过滤掉 null、转成 DTO、或统一处理字符串大小写,才值得引入
。
性能上,它比构造函数慢一截:至少多一次迭代 + Collector 分配开销,JVM 很难完全优化掉。
立即学习
“
Java免费学习笔记(深入)
”;
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
必须显式调用
,
本身不提供流接口
返回的是非特定实现的
,JDK 17+ 是
,但不应依赖具体类型
如果用
,反而绕远路,没优势
不能直接用在
上
只接受可变参数或数组,传
会把它当单个元素塞进 List,结果是
,不是你想要的展开内容。
错误示例:
→ 返回一个含 1 个元素(那个
对象)的 List。
正确展开只能靠构造函数或 Stream
有人试过
,但返回的是
,泛型信息丢失,且对值类型还要强转
若真要用数组中转,应写成
,纯属画蛇添足
并发修改或不可变
时要小心
如果
来自
或
,用构造函数没问题;但如果是
或其他并发集合,注意其迭代器行为是否符合预期(比如是否反映实时变更)。
更隐蔽的坑:某些框架返回的
是懒加载代理(如 Hibernate 的
),首次调用
才触发查询——构造函数里隐式触发,可能引发 N+1 或事务上下文异常。
调试时发现 List 大小为 0 但 Set 明明有元素?先检查是否代理未初始化
不确定来源时,加一行
没意义,不如直接 try-catch + 日志
生产环境遇到
?大概率是多线程同时读写原
,构造函数只是暴露了问题,不是根源
事情说清了就结束
ArrayListSetnew ArrayList(set)Arrays.copyOffor (T t : set) list.add(t)HashSetSetHashSetLinkedHashSetTreeSetLinkedHashSetArrayListTreeSetsetnullNullPointerExceptionStreamStreamstream().collect(Collectors.toList()).stream()SetCollectors.toList()ListArrayListCollectors.toCollection(ArrayList::new)Arrays.asList()SetArrays.asList()Set[someHashSet]Arrays.asList(mySet)SetArrays.asList(mySet.toArray())Listnew ArrayList(Arrays.asList(set.toArray(new T[0])))SetSetCollections.unmodifiableSet()Set.of()CopyOnWriteArraySetSetPersistentSetiterator()if (set instanceof java.util.AbstractSet) { ... }ConcurrentModificationExceptionSet