你好!在本文中,我们将了解如何在 Java 中将元素列表转换为元素数组。其实实现的方法并没有那么多,而且都很简单,所以文章不会复杂。 让我们立即决定我们要做什么。我们将列表转换为数组,更具体地说,字符串列表:I、love、learning、on、JavaRush 将转换为相同字符串的数组。但首先,有一点好处。我们来谈谈如何快速写下清单。
如何快速将列表写入数组
记住:这一生有两种情景。当我们初始化一个新列表时,第一个是彻底的忧郁和无聊:List<String> wordsList = new ArrayList();
然后我们给它添加值……一一……
wordsList.add("I");
wordsList.add("love");
wordsList.add("learning");
wordsList.add("on");
wordsList.add("JavaRush");
不好。我在创建列表时忘记了为什么需要该列表!第二种方法是切断所有不必要的东西并采用......实用程序类。例如,类Arrays
,它有一个非常方便的方法asList
。您可以将想要创建列表的任何内容传递给它,该方法将使其成为一个列表。像这样的东西:
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
varargs
从某种意义上说, 该方法本身就是一个数组。我很抱歉,在名为“列表到数组”的讲座中,我首先教了您从数组到列表,但情况需要它。好吧,现在介绍我们将列表转换为数组的方法。
方法号 1。摔碎
这种方法非常适合那些喜欢不假思索地在键盘上敲代码的人。一种冥想。步骤 1. 创建一个与列表长度相同的数组:List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = new String[wordsList.size()];
步骤 2. 创建一个带有计数器的循环,以迭代列表的所有元素,并能够按索引访问数组单元格:
for (int i = 0; i < wordsList.size(); i++) {
}
步骤 3. 在循环内,我们将索引为 i 的每个列表元素的值分配给索引为 i 的数组单元格:
for (int i = 0; i < wordsList.size(); i++) {
wordsArray[i] = wordsList.get(i);
}
结果:
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = new String[wordsList.size()];
for (int i = 0; i < wordsList.size(); i++) {
wordsArray[i] = wordsList.get(i);
}
}
方法 2。toArray方法
可能是最适合使用的东西。该接口List
有两种toArray
从当前列表创建数组的方法:
Object[] toArray();
T[] toArray(T[] a);
第一个方法返回一个对象数组,其中包含当前列表的所有元素(从第一个到最后一个):
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = (String[]) wordsList.toArray();
for (String word : wordsArray) {
System.out.println(word);
}
}
}
让我们运行该方法main
并看到以下内容:
I
love
learning
on
JavaRush
然而,这个方法有一个特点:它总是返回一个对象数组(Object[])
。因此,返回的结果必须转换为所需的数据类型。在上面的示例中,我们将其转换为字符串数组(String[])
。但此方法不接受参数,这在某些情况下很方便。第二种方法还返回一个包含当前列表中所有元素(从第一个到最后一个)的数组。但是,与第一个方法不同,第二个方法采用某种类型的数组作为参数。但第二个方法的结果不会是对象数组,而是某种数据类型的数组 - 与作为参数传递的数组方法中的数据类型相同。
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = wordsList.toArray(new String[0]);
for (String word : wordsArray) {
System.out.println(word);
}
}
}
如果我们运行该方法main
,我们将在输出中看到相同的单词:
I
love
learning
on
JavaRush
我们来谈谈作为参数传递给 的数组toArray
。该方法的逻辑取决于传输数组的长度。存在三种可能的情况:
1、传输的数组长度小于列表长度
在本例中,该方法创建一个新数组并将列表元素放入其中。我们在上面的例子中演示了这一点。2. 传递的元素长度等于列表长度
该方法会将列表元素放入传递的数组中。让我们来演示一下:public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
// Создаем пустой массив нужной длины
String[] array = new String[wordsList.size()];
// Отправляем пустой массив в метод toArray
wordsList.toArray(array);
// Проверяем, заполнился ли наш массив. Спойлер: да
for (String word : array) {
System.out.println(word);
}
}
}
输出时,我们将看到所有相同的行,并且很明显该方法已填充我们创建的数组。
3、传输的数组长度大于列表长度
该方法会将列表中的所有元素写入一个数组,并将值写入最后添加的元素旁边的单元格中null
。让我们来演示一下:
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
// Создаем пустой массив, длина которого в 2 раза больше длины списка
String[] array = new String[wordsList.size() * 2];
for (int i = 0; i < array.length; i++) {
// В каждую ячейку запишем строковое представление текущего индекса
array[i] = String.valueOf(i);
}
// Отправляем массив в метод toArray
wordsList.toArray(array);
// Проверяем, что лежит в нашем массиве
for (String word : array) {
System.out.println(word);
}
}
}
main
在控制台中 运行该方法后,我们将看到以下内容:
I
love
learning
on
JavaRush
null
6
7
8
9
您应该选择三种方法中的哪一种?在 Java 的早期版本中,最好传递长度等于或大于列表长度的数组。然而,现代 JVM 进行了优化,在某些情况下,它们为传递长度小于列表长度的数组的方法提供了更快的性能。因此,如果您运行的是现代版本的 Java,请将空数组传递给方法,就像我们在第一个示例中所做的那样:
wordsList.toArray(new String[0]);
方法号 3。流媒体接口
此方法适合那些不仅想要将列表转换为数组,而且还想解决一些其他问题的人。也适合熟悉 Java Stream API 的人。JavaRush 有一篇关于这个主题的好文章。在本节中,我们将查看几个使用流的示例。如何使用流将列表转换为数组:public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] strings = wordsList.stream()
.toArray(String[]::new);
for (String s : strings) {
System.out.println(s);
}
/*
Output:
I
love
learning
on
JavaRush
*/
}
}
但如果您只需要将列表转换为数组,那么最好使用toArray
方法 2 中描述的方法来执行此操作。但是,如果您不仅想将列表转换为数组,还想对每个元素执行某些操作,那么这里就是您的正确选择。让我们尝试将列表转换为数组,以便在最终数组中所有行都以大写形式写入:
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] strings = wordsList.stream()
.map(str -> str.toUpperCase())
.toArray(String[]::new);
for (String s : strings) {
System.out.println(s);
}
/*
Output:
I
LOVE
LEARNING
ON
JAVARUSH
*/
}
}
在这里,.map(str -> str.toUpperCase())
我们定义了列表中每一行需要执行的操作。在这种情况下,我们决定将每个字符串转换为大写,然后将其收集到一个数组中。使用 Stream API 不仅可以转换每个值,还可以过滤它们。假设我们想要从字符串列表中收集一个数组,但是以这样的方式,数组中只包含长度超过两个字符的字符串:
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] strings = wordsList.stream()
.filter(str -> str.length() > 2)
.map(str -> str.toUpperCase())
.toArray(String[]::new);
for (String s : strings) {
System.out.println(s);
}
/*
Output:
LOVE
LEARNING
JAVARUSH
*/
}
}
在此行中,.filter(str -> str.length() > 2)
我们创建了一个所谓的过滤器,该过滤器将在列表的每个元素进入数组之前应用于该元素。在这种情况下,将为每一行调用该方法length()
,如果表达式的结果str.length() > 2
为 true,则这样的行将最终出现在结果选择中,并最终出现在数组中。不然打不着。在这里,也许值得一提的是,通过简单地迭代元素并施加各种限制就可以实现相同的效果。你也可以这样做。Stream API 提供了一种更实用的方法来解决此类问题。
结果
在本文中,我们研究了将列表转换为数组的各种方法:- 简单的搜索;
- 方法
toArray;
- 流 API。
toArray
接口中定义的方法List
。有两种这样的方法:
Object[] toArray();
T[] toArray(T[] a);
GO TO FULL VERSION