List<Integer> list = Arrays.asList(1, 2, 3, 4);
Integer[] arr = new Integer[]{1, 2, 3, 4};
List<Integer> list = Arrays.asList(arr);
⚾️ Array(배열)와 List의 데이터 타입이 같아야한다.
잘못된 경우 :
int[] arr = new int[]{1, 2, 3, 4}; List<Integer> list = Arrays.asList(arr);
List<Integer> list_1 = Arrays.asList(1, 2, 3, 4);
List<Integer> list_2 = new LinkedList<>(list_1);
Arrays.asList를 사용하면 배열처럼 고정된 크기의 리스트 생성이 가능함
이 리스트는 값 변경은 가능하지만, 크기에 영향을 주는 삭제나 추가는 불가능
List<Integer> list = Arrays.asList(1, 2, 3, 4);
list.set(0, 6); //(시작 인덱스, 설정 값)
list.add(6); // 모태요
list.remove(0); // 이것도 못해요
코테 문제를 풀다보면
int [] solution = {};
이렇게 Array를 반환으로 요구하는 경우가 많은데
풀이 과정에서 List를 사용했다면 반환을 위해 이를 array로 바꿔야 함
List<Integer> list = Arrays.asList(1, 2, 3, 4);
int[] arr = new int[list.size()];
for(int i = 0; i < list.size(); i++){
arr[i] = list.get(i);
}
List<String> list = Arrays.asList("A", "B", "c");
String[] str = list.toArray(String[]::new)
List<Integer> list = Arrays.asList(1, 2, 3, 4);
Integer[] arr = list.toArray(Integer[]::new);
toArray 역시 타입이 서로 같아야 사용할 수 있음
List<String> list = Arrays.asList("A", "B", "C");
String[] arr = list.stream().toArray(String[]::new);
List<Integer> list = Arrays.asList(1,2,3,4,5);
int[]arr = list.stream().mapToInt(Integer::intValue).toArray();
리스트 요소를 반복문을 통해 삭제할 경우 발생하는 일
for문을 list의 size만큼 수행하며 인덱스 안의 값을 하나 하나 지워보자!
List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
for(int i = 0; i<list.size(); i++){
list.remove(i)
}
하지만, 이 코드를 수행 후 결과를 출력하면
[2, 4]가 출력된다!!
그 이유는 list안의 요소가 반복문을 통해 지워지면서 list.size()값이 계속 바껴서임!
반복문이 처음 실행될 때에는 0을 인덱스로 하는 요소를 제대로 삭제하지만, 삭제할 때마다 list의 size가 줄어들어 값의 인덱스가 고정되지 않아 제대로 동작 X
그럼 항상 인덱스 0번째 값을 삭제하면 되는거 아닌가요?
List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
for(int i = 0; i<list.size(); i++){
list.remove(0);
}
이렇게 해도 i가 증가하며 size도 감소하기 때문에 제대로 동작 X
해결 방법 : 새 변수에 size값을 고정해두자
List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
int size = list.size();
for(int i = 0; i<size; i++){
list.remove(0);
}
리스트를 함수로 전달할 때 call by reference로 전달하게 되는데 이 경우, final로 선언한다 해도 리스트 내용을 변경할 수 있음
void main(){
List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
updateList(list);
System.out.println(list); // [2, 4, 6, 8, 10] 출력
}
void updateList(final list<Integer> list){
for(int i = 0; i<list.size(); i++){
list.set(i, list.get(i) * 2);
}
}
list를 final로 선언해 updateList에 전달했는데도 값이 변경됐다!!!
이런 현상을 방지하기위해서는 원본 리스트가 훼손되지 않도록하는 리스트 형태로 만들어야함!!!
void main(){
List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
updateList(Collections.unmodifiableList(list));
System.out.println(list);
}
void updateList(final list<Integer> list){
for(int i = 0; i<list.size(); i++){
list.set(i, list.get(i) * 2); // Error!!! 발생
}
}
Collections.unmodifiableList()를 사용하면 리스트 내용을 변경하지 못하게 만들 수 있음!
끄ㅡㅅ!