你好!在本文中,我們將了解如何在 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