文
章
目
录
章
目
录
学习在 Java 中将List集合转换为数组,以及将给定数组转换为List。我们将学习使用核心 Java API 的转换。
- 在 Java 中,List是基于索引的有序集合,它通过整数索引位置提供对元素的随机访问。
- 数组也类似于列表,但存储在连续的内存中。
1.列表转数组
我们可以使用以下两种方法将给定List转换为数组。
1.1. List.toArray()
使用list.toArray() 是将List列表转换为数组的最简单方式。它是一个重载的函数。
Object[] toArray()
:返回一个包含列表中所有元素的数组。<T> T[] toArray(T[] a)
:返回包含列表中所有元素的数组,返回数组的类型与指定的数组a的类型相同。
如果集合适合指定的数组,则将其返回到其中。否则,将分配给定列表大小的新数组。如果指定的数组长度超过列表长度,则备用索引将填充为null
。default <T> T[] toArray(IntFunction<T[]> generator)
:返回一个包含列表中所有元素的数组,提供的生成器函数用于分配返回的数组。
让我们看一下这些方法的一些示例。
List<String> list = Arrays.asList("A", "B", "C");
String[] stringArray;
//1
Object[] objArray = list.toArray();
//2
stringArray = list.toArray(new String[0]);
//3
stringArray = list.toArray(String[]::new);
1.2. Stream.toArray()
该stream.toArray()
方法类似于上面讨论的list.toArray()方法。它也是一个重载方法。
Object[] toArray()
:返回一个数组,其中包含从列表中获取的流的元素。<A> A[] toArray(IntFunction<A[]> generator)
:返回一个数组,其中包含从列表中获取的流的元素以及用于分配返回数组的生成器函数。
List<String> list = Arrays.asList("A", "B", "C");
String[] stringArray = list.stream().toArray(String[]::new);
使用流的好处如下:
- 如果列表的大小相对较大,无法在单个线程中进行处理,我们可以使用list.parallelStream()。并行流使我们能够在不同的核心上并行执行代码。然而,执行的顺序不受我们控制,因此数组中的项目将不按照列表中的顺序排列。
- 另一个优点是,我们可以应用中间流操作,比如filter(),如果我们只需要从列表中选择性地填充项目。
例如,在给定的代码中,我们只想用列表中以字符‘A’开头的项目来填充数组。
String[] filteredArray = list.stream()
.filter(s -> s.equals("A"))
.toArray(String[]::new);
2. 将数组转换为List
2.1. 使用Arrays.asList()
在 Java 中将数组转换为列表是一项相当简单的工作。我们需要使用Arrays.asList() API。请注意,返回的列表是由给定 array 支持的固定大小列表。对数组所做的更改将在返回的列表中可见,对列表所做的更改将在数组中可见。
String[] stringArray = new String[]{"A", "B", "C"};
List<String> list = Arrays.asList(stringArray);
在列表上调用的任何可以更改其大小的方法都将抛出UnsupportedOperationException。尽管如此,我们仍然可以修改列表中存储的对象。
//改变List和数组
list.set(0, "Aa");
//List和数组都改变了
System.out.println(list); //[Aa, B, C]
System.out.println(Arrays.toString(stringArray)); //[Aa, B, C]
list.add("D"); //java.lang.UnsupportedOperationException
2.2. 使用Collections.unmodifyingList()
要创建不可修改的List列表,我们应该使用Collections.unmodifyingList() API。
String[] stringArray = new String[]{"A", "B", "C"};
List<String> list = Collections.unmodifiableList(Arrays.asList(stringArray));
//Cannot change the list
list.set(0, "Aa"); //java.lang.UnsupportedOperationException
2.3. 使用迭代和Stream流
要创建一个独立于数组的新可变List列表,我们可以使用Stream API 迭代数组并逐个填充List列表。
//改变List但不改变数组
list.add("D");
//List改变了但数组没改变
System.out.println(list); //[A, B, C, D]
System.out.println(Arrays.toString(stringArray)); //[A, B, C]
3.结论
在这个简短的教程中,我们学会了使用list.toArray()和stream.toArray()方法将列表(例如ArrayList)转换为数组。同样,我们学会了使用Arrays.asList()方法从数组中获取列表。
还有一些其他方法,例如使用Apache Commons和Guava API,但在没有明显好处的情况下,这样做就显得有些多余。