在Java中将列表转换为集的最简单的方法是什么?
当前回答
我同意sepp2k,但还有其他一些细节可能很重要:
new HashSet<Foo>(myList);
会给你一个没有重复项的无序集合。在这种情况下,使用对象上的.equals()方法标识复制。这是与. hashcode()方法一起完成的。(更多关于平等的信息请点击这里)
给出一个排序集合的替代方法是:
new TreeSet<Foo>(myList);
如果Foo实现Comparable,这是有效的。如果没有,你可以使用比较器:
Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);
这取决于compareTo()(来自可比较接口)或compare()(来自比较器)来确保唯一性。如果你只关心唯一性,使用HashSet。如果您正在进行排序,那么请考虑TreeSet。(记住:以后再优化!)如果时间效率很重要,则使用HashSet;如果空间效率很重要,则查看TreeSet。注意,Set和Map的更有效实现可以通过Trove(和其他位置)获得。
其他回答
不要忘记我们相对较新的朋友,java-8流API。 如果你需要在将列表转换为集合之前对其进行预处理,最好是这样:
list.stream().<here goes some preprocessing>.collect(Collectors.toSet());
Set<Foo> foo = new HashSet<Foo>(myList);
带有Optional.ofNullable的更具Java 8弹性的解决方案
Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);
如果使用Eclipse Collections:
MutableSet<Integer> mSet = Lists.mutable.with(1, 2, 3).toSet();
MutableIntSet mIntSet = IntLists.mutable.with(1, 2, 3).toSet();
MutableIntSet接口扩展了java.util.Set,而MutableIntSet接口没有。您还可以使用Sets工厂类将任何Iterable转换为Set。
Set<Integer> set = Sets.mutable.withAll(List.of(1, 2, 3));
在Eclipse Collections中有更多关于可变工厂的解释。
如果你想从List中获得一个ImmutableSet,你可以像下面这样使用Sets工厂:
ImmutableSet<Integer> immutableSet = Sets.immutable.withAll(List.of(1, 2, 3))
注意:我是Eclipse Collections的提交者
有多种方法来获取一个Set为:
List<Integer> sourceList = new ArrayList();
sourceList.add(1);
sourceList.add(2);
sourceList.add(3);
sourceList.add(4);
// Using Core Java
Set<Integer> set1 = new HashSet<>(sourceList); //needs null-check if sourceList can be null.
// Java 8
Set<Integer> set2 = sourceList.stream().collect(Collectors.toSet());
Set<Integer> set3 = sourceList.stream().collect(Collectors.toCollection(HashSet::new));
//Guava
Set<Integer> set4 = Sets.newHashSet(sourceList);
// Apache commons
Set<Integer> set5 = new HashSet<>(4);
CollectionUtils.addAll(set5, sourceList);
当我们使用collections . toset()时,它返回一个集合,并且根据文档:对于返回的set的类型、可变性、可序列化性或线程安全性没有保证。如果我们想要获得一个HashSet,那么我们可以使用另一种方法来获得一个set(检查set3)。
推荐文章
- 在log4j中,在记录日志之前检查isDebugEnabled是否能提高性能?
- 没有JAXB生成的@XmlRootElement
- Java中对象的内存消耗是多少?
- 获取Spring应用程序背景信息
- 为什么在Java中使用静态嵌套接口?
- @Mock, @MockBean和Mockito.mock()的区别
- JDK 8中的PermGen消除
- 如何将CharSequence转换为字符串?
- 在Java中初始化一个long
- Java的数组indexOf在哪里?
- 同一个键下的多个值
- 使用JSTL检查集合大小
- Java“虚拟机”vs. Python“解释器”的说法?
- 获取操作系统级别的系统信息
- 如何通过SFTP从服务器检索文件?