Автор оригинала: Pankaj Kumar.
Иногда нам приходится преобразовывать ArrayList в массив в java-программе. Сегодня мы рассмотрим различные варианты преобразования java ArrayList в массив.
Java ArrayList в массив
ArrayList в Java поддерживается массивом. Поэтому неудивительно, что 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 strList = new ArrayList();
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 метод перегружен. Другой – без какого-либо аргумента, возвращающего массив объектов. Однако это не рекомендуется, потому что тогда вам придется привести объект к правильному типу для любых операций.
ArrayList для массива в Java – другие способы
При передаче массива в качестве аргумента в методе toArray нам не нужно указывать точный размер массива. Приведенный ниже код тоже отлично работает.
strArr = strList.toArray(new String[0]); System.out.println(Arrays.toString(strArr));
Если вы используете Java 8 или выше, вы также можете использовать Stream для преобразования списка массивов в массив.
strArr = strList.stream().toArray(String[]::new); System.out.println(Arrays.toString(strArr));
Java ArrayList в массив – Неглубокая копия
Когда мы преобразуем ArrayList в массив с помощью описанных выше методов, он возвращает неглубокую копию элементов в списке . Таким образом, любое изменение в ArrayList или массиве будет отражено и в другом. Ниже приведена простая программа, показывающая такое поведение.
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("Pankaj");
Person p2 = new Person("Lisa");
List 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;
}
}
Когда мы запускаем вышеописанную программу java, она возвращает следующий вывод.
Original List = [Pankaj, Lisa] Created Array from ArrayList = [Pankaj, Lisa] Modified List = [David, Ram] Modified Array = [David, Ram]
Как вы можете видеть, мы изменили первый элемент ArrayList и второй элемент массива. Однако изменения отражаются как в ArrayList, так и в массиве, и в конце у обоих есть одни и те же объекты.
Java ArrayList для глубокой копии массива
Поэтому, если вы хотите преобразовать ArrayList в массив и хотите, чтобы они были отделены, вам придется сделать глубокую копию и написать код для себя. Ниже приведен переработанный код, показывающий, как выполнить глубокое копирование для преобразования списка массивов в массив.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArrayListToArrayDeepCopy {
public static void main(String[] args) {
Person p1 = new Person("Pankaj");
Person p2 = new Person("Lisa");
List 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
Original List = [Pankaj, Lisa]
Created Array from ArrayList = [Pankaj, Lisa]
Modified List = [David, Lisa]
Modified Array = [Pankaj, Ram]
Это все для преобразования java ArrayList в массив с использованием разных методов.
Ссылка: Java ArrayList toArray API Doc