有时需要在java程序中将ArrayList
转换为数组。在本小节中将学习几个java中将 ArrayList转换为数组的方法。
Java中的ArrayList
由数组支持。所以毫无疑问,ArrayList
提供了将ArrayList
转换为数组的实用程序方法。让我们看一个简单的程序,演示如何将ArrayList转换为java中的数组。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArrayListToArray {
public static void main(String[] args) {
List<String> strList = new ArrayList<String>();
strList.add("1");
strList.add("2");
strList.add("3");
String[] strArr = null;
strArr = strList.toArray(new String[strList.size()]);
System.out.println(Arrays.toString(strArr));
}
}
如果研究ArrayList方法,则发现它重载了toArray
方法。另一个是没有任何返回Object
数组的参数。但是,不推荐使用它,因为它必须将对象强制转换为适合任何操作的类型。
ArrayList转为数组 - 其他方式
在将数组作为参数传递给toArray
方法时,不需要为数组提供精确的大小。下面的代码工作正常。
strArr = strList.toArray(new String[0]);
System.out.println(Arrays.toString(strArr));
如果使用的是Java 8或更高版本,则也可以使用Stream
将ArrayList
转换为数组。
strArr = strList.stream().toArray(String[]::new);
System.out.println(Arrays.toString(strArr));
ArrayList转为数组 - 浅拷贝
当使用上述方法将ArrayList
转换为数组时,它会返回列表中元素的浅表副本。因此,ArrayList
或Array
中的任何更改也将反映在其他更改中。下面是一个显示此行为的简单程序。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArrayListToArrayMutableObjects {
public static void main(String[] args) {
Person p1 = new Person("Maxsu");
Person p2 = new Person("Lisa");
List<Person> pList = new ArrayList<>();
pList.add(p1); pList.add(p2);
Person[] pArray = pList.toArray(new Person[0]);
System.out.println("Original List = "+pList);
System.out.println("Created Array from ArrayList = "+Arrays.toString(pArray));
//let's change the list and array
pList.get(0).setName("David");
pArray[1].setName("Ram");
System.out.println("Modified List = "+pList);
System.out.println("Modified Array = "+Arrays.toString(pArray));
}
}
class Person {
private String name;
public Person(String n) {
this.name = n;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return this.name;
}
}
执行上面示例代码,得到以下结果 -
Original List = [Maxsu, Lisa]
Created Array from ArrayList = [Maxsu, Lisa]
Modified List = [David, Ram]
Modified Array = [David, Ram]
如上所见,更改了ArrayList
的第一个元素和Array
的第二个元素。但是,更改会反映在ArrayList和Array中,最后两者都具有相同的对象。
ArrayList转为数组 - 深拷贝
因此,如果想将ArrayList
转换为Array
并希望它们被分离,那么将不得不为自己做一个深层复制并编写代码。下面是一个重构代码,显示了如何执行深度复制以将ArrayList
转换为Array
。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArrayListToArrayDeep {
public static void main(String[] args) {
Person p1 = new Person("Maxsu");
Person p2 = new Person("Lisa");
List<Person> pList = new ArrayList<>();
pList.add(p1); pList.add(p2);
//convert ArrayList to Array using deep copy
Person[] pArray = new Person[pList.size()];
for(int i =0; i<pList.size(); i++) {
Person p = pList.get(i);
Person temp = new Person(p.getName());
pArray[i] = temp;
}
System.out.println("Original List = "+pList);
System.out.println("Created Array from ArrayList = "+Arrays.toString(pArray));
//let's change the list and array
pList.get(0).setName("David");
pArray[1].setName("Ram");
System.out.println("Modified List = "+pList);
System.out.println("Modified Array = "+Arrays.toString(pArray));
}
}
执行上面示例代码,得到以下结果 -
Original List = [Maxsu, Lisa]
Created Array from ArrayList = [Maxsu, Lisa]
Modified List = [David, Lisa]
Modified Array = [Pankaj, Ram]