1. 利用构造器Constructor
复制一个List的简单方法是使用以一个集合作为参数的构造函数:
package net.javaguides.examples;import java.util.ArrayList;import java.util.List;/** * Different ways to copy a list into another list * * @author Noseparte * */public class CopyListExamples { public static void main(String[] args) { List < String > fruits = new ArrayList < > (); // Adding new elements to the ArrayList fruits.add("Banana"); fruits.add("Apple"); fruits.add("mango"); fruits.add("orange"); System.out.println(fruits); // using constructor List < String > copyFruits = new ArrayList < > (fruits); System.out.println(copyFruits); }}
Output:
[Banana, Apple, mango, orange][Banana, Apple, mango, orange]
这种方法并不是线程安全的。我们可能会得到ConcurrentAccessException错误,为了解决这个问题,我们可能需要使用CopyOnWriteArrayList,在这个方法中,所有的突变操作都是通过对底层数组进行重新复制来实现的。
2. 使用 addAll() method
另一种复制元素的方法是使用addAll()方法:
package net.javaguides.examples;import java.util.ArrayList;import java.util.List;/** * Different ways to copy a list into another list * * @author Noseparte * */public class CopyListExamples { public static void main(String[] args) { List < String > fruits = new ArrayList < > (); // Adding new elements to the ArrayList fruits.add("Banana"); fruits.add("Apple"); fruits.add("mango"); fruits.add("orange"); System.out.println(fruits); // using the addAll method List < String > copy = new ArrayList < > (); copy.addAll(fruits); System.out.println(copy); }}
Output:
[Banana, Apple, mango, orange][Banana, Apple, mango, orange]
3. 使用 Collections.copy() method
[Collections]类完全由操作或返回集合的静态方法组成。
其中一个是copy()方法,它需要一个源列表和一个至少和源列表一样长的目标列表。
该方法将源列表中的所有元素复制到目的列表中。复制后,源列表和目的列表中的元素的索引将是相同的。
目的列表必须足够长,以容纳所有复制的元素。如果它长于此,目标列表中的其余元素将不受影响。
package net.javaguides.examples;import java.util.ArrayList;import java.util.Collections;import java.util.List;/** * Different ways to copy a list into another list * * @author Ramesh Fadatare * */public class CopyListExamples { public static void main(String[] args) { List < String > fruits1 = new ArrayList < > (); // Adding new elements to the ArrayList fruits1.add("Banana"); fruits1.add("Apple"); fruits1.add("mango"); fruits1.add("orange"); System.out.println(fruits1); // using the Collections.copy() method List < String > fruits2 = new ArrayList < > (fruits1.size()); fruits2.add("1"); fruits2.add("2"); fruits2.add("3"); fruits2.add("4"); Collections.copy(fruits2, fruits1); System.out.println(fruits2); }}
Output:
[Banana, Apple, mango, orange][Banana, Apple, mango, orange]
4. 在 Java 8 中的使用方式
使用Java 8 Stream APIs 将List复制到另一个List中 :
package net.javaguides.examples;import java.util.ArrayList;import java.util.List;import java.util.stream.Collectors;/** * Different ways to copy a list into another list * * @author Noseparte * */public class CopyListExamples { public static void main(String[] args) { List < String > fruits = new ArrayList < > (); // Adding new elements to the ArrayList fruits.add("Banana"); fruits.add("Apple"); fruits.add("mango"); fruits.add("orange"); System.out.println(fruits); // using Java 8 Stream APIs List < String > copy = fruits.stream() .collect(Collectors.toList()); System.out.println(copy); }}
Output:
[Banana, Apple, mango, orange][Banana, Apple, mango, orange]
5. 在JDK10中的使用方式
最后,最后一个Java版本允许我们创建一个包含给定Collection元素的不可变列表:
package net.javaguides.examples;import java.util.ArrayList;import java.util.List;/** * Different ways to copy a list into another list * * @author Noseparte * */public class CopyListExamples { public static void main(String[] args) { List < String > fruits = new ArrayList < > (); // Adding new elements to the ArrayList fruits.add("Banana"); fruits.add("Apple"); fruits.add("mango"); fruits.add("orange"); System.out.println(fruits); // using Java 8 copyOf() method List < String > copy = List.copyOf(fruits); System.out.println(copy); }}
Output:
[Banana, Apple, mango, orange][Banana, Apple, mango, orange]
总结
在本文中,我们已经探讨了5种不同的方法来将一个List复制到另一个的List中以及不同Java版本。