JavaRush /Java 博客 /Random-ZH /Java列表转数组:将元素列表转换为数组
Анзор Кармов
第 31 级
Санкт-Петербург

Java列表转数组:将元素列表转换为数组

已在 Random-ZH 群组中发布
你好!在本文中,我们将了解如何在 Java 中将元素列表转换为元素数组。其实实现的方法并没有那么多,而且都很简单,所以文章不会复杂。 Java列表转数组:将元素列表转换为数组 - 1让我们立即决定我们要做什么。我们将列表转换为数组,更具体地说,字符串列表: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);
第一个不接受参数,但返回一个对象数组,这就是为什么您通常必须诉诸显式类型转换的原因。第二个返回所需类型的数组,但采用数组作为参数。最好将一个空数组传递给该方法,您会很高兴。使用 Stream API 不仅可以将列表转换为数组,还可以在此过程中执行一些操作,例如在将元素添加到数组之前过滤或转换元素。

家庭作业

尝试自己重复本文中的所有示例,但不要使用原始字符串列表,而是使用 0 到 10 之间的整数列表。当然,您必须将示例中仅适用于字符串的一些条件调整为新的字符串。状况。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION