스트림을 공부하다보니 배열에 들어갈 각 요소들을 리스트에 담을때 2가지 방법으로 선언하는 것을 알 수 있었다.
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
자바에서 Array를 List로 반환하기 위해서는 Arrays.asList(array)를 사용한다. 근데 List.of(array)도 같은 기능을 한다.
둘의 차이는 다음에 있다.
List<Integer> list = Arrays.asList(1, 2, null);
list.set(1, 10);
//(1, 10)
List<Integer> list = List.of(1, 2);
list.set(1, 10)
//Fails woth UnsupportedOperationException
- Arrats.asList 는 ArratList를 반환하고 set등이 구현되어있다. 반면 List.of 는 ListN이라는 타입의 객체를 반환하는데 이는 불변객체기 때문에 수정할 수 없다.
- 참고로 Arrys.asList()가 반환하는 ArrayList 타입은 java,utill.ArrayList가 아니라 Arrays내부 클래스이다. 따라서 add나 remove는 구현되어있지 않기 때문에 크기를 변경할순 없다.
Integer[] array = {1,2};
List<Integer> list = Arrays.asList(array);
array[0] = 100;
System.out.println(list); // [100, 2]
Array.asList는 참조를 사용하기 때문에 배열의 값이 변경되면 list에도 영향이간다 즉 수정이 가능하다.
Integer[] array = {1,2};
List<Integer> list = List.of(array);
array[0] = 100;
System.out.println(list); // [1, 2]
List.of는 값을 기반으로 독립적인 객체를 새로 만들기 때문에 참조가 아니라 수정이 안된다.
reference : https://jaehoney.tistory.com/144