모든 원소를 하나씩 다 탐색하며 복사할 수도 있겠지만 그건 너무 비효율적이다. 더 간결한 방식으로 할 수 있는 List와 Array 간 형변환을 정리해보았다.
toArray()List<Integer> list = new ArrayList<>();
// ...
Object[] arr = list.toArray();
toArray()는 Object 타입의 배열을 반환한다.toArray(T[] a)List<Integer> list = new ArrayList<>();
// ...
Integer[] arr = list.toArray(new Integer[0]);
toArray(T[] a)는 T 타입 배열을 반환한다.T는 값 타입이 될 수 없기 때문에 int, double, float와 같은 타입의 배열은 이 방법으로는 얻을 수 없다.a의 길이는 0으로 지정하면 알아서 list의 길이에 맞게 조정되어 arr에 저장된다.streamList<Integer> list = new ArrayList<>();
// ...
int[] arr = list.stream()
.mapToInt(Integer::intValue)
.toArray();
stream이다.list.stream(): Stream<Integer>을 반환한다.mapToInt(Integer::intValue): Integer의 intValue() 메서드를 참조해서 값타입인 int로 언박싱한다.toArray(): IntStream의 원소를 배열로 변환한다.Arrays.asList(T[] a)String[] arr = {"a", "b", "c", "d"};
List<String> list = Arrays.asList(arr);
T가 값 타입이 아닌 경우 위와 같이 간편하게 변환할 수 있다.streamint[] arr = {1, 2, 3};
List<Integer> list = Arrays.stream()
.boxed()
.collect(Collectors.toList());
mapToInt() 과정을 통해 Integer를 int로 언박싱해준 것처럼, 여기서는 반대로 boxed()를 통해 int를 Integer로 박싱해줘야 한다.IntStream로 원소들을 넘겨받았으니 collect()를 호출해서 List로 변환한다.