자바 자료구조#02. List의 특징

A Kind Dev·2022년 8월 18일
0

자바 자료구조

목록 보기
4/20

List 기본 함수

  • List에 값 추가
    List<Integer> list = new LinkedList<>();
     list.add(1);
     list.add(2);
     list.add(3);
  • List에서 값 삭제
    list.remove(2);
  • List가 특정값을 포함하는지 확인
    list.contains(2);
  • List의 크기
    list.size();
  • 빈 List인지 확인
    list.isEmpty();
  • 객체 List 생성
    List<MyData> list = new LinkedList<>();
     list.add(new MyData());
  • 불변 List 형태로 전환
    함수 인수로 List를 전달할 때 원본 리스트가 훼손되지 않도록 하기 위해서
    List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
     updateList(Collections.unmodifiableList(list));
     
     void updateList(final List<Integer> list) {
     	for (int i = 0; i < list.size(); i++) {
       		list.set(i, list.get(i) * 2); // ERROR!!
     	}
     }

List 종류

List<E> list = new Vector<>();
List<E> list = new ArrayList<>();

LinkedList

  • Double Linked List 구조
  • 데이터가 많을 때 뒤쪽 인덱스에서부터 앞으로 접근해야 하는 경우 유용

ArrayList

  • Resizable Array
  • Array의 특징(연속된 공간) + 크기가 늘어남
  • Array의 크기를 늘려야 할 경우 새로 들어갈 값이 있는 공간 확보
    --> 기존 값 복사
    --> 새 값 추가
    --> 기존 공간 삭제
  • InitialCapacity (초기 크기)
    초기에 10만큼의 공간 확보 -> 10 이상부터는 새 요소를 추가할 때마다 공간이 늘어남
    List<E> list = new ArrayList<>(10);
  • index를 사용하여 값을 빠르게 검색할 수 있음 (LinkedList보다 유리함)
  • 비동기

Vector

  • Growable Array
  • InitialCapacity 를 가지고 있으면서 + 몇개씩 늘릴지를 지정 가능
  • 동기화 (thread-safe)
    멀티스레드 환경에서 값을 추가/삭제할 경우 동기화 (ArrayList보다 유리함)

List 생성하기

고정 값으로 List 만들기

List에 입력될 값들을 사용해서 리스트를 만들기

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

Array로 List 만들기

배열을 List로 변환
배열처럼 고정된 크기
-> 값을 변경할 수는 있지만 크기에 영향을 주는 add/remove 작업은 불가

Integer[] arr = new Integer[]{1, 2, 3, 4, 5};
List<Integer> list = Arrays.asList(arr);

List로 List 만들기

기존의 List로 새 List 만들기

List<Integer> list1 = Arrays.asList(1,2,3,4,5);
List<Integer> list2 = new LinkedList<>(list1);

List를 Array로 변경하기

코딩테스트 문제에서 반환값이 array인 경우

for문으로 Array에 복사

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int[] arr = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
	arr[i] = list.get(i);
}

toArray

만들고자 하는 배열타입의 생성방법을 지정해야 함
최종 배열 타입이 다를 경우 사용 불가 (자동 형변환-auto unboxing이 적용되지 않음)

(정상)
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Integer[] arr = list.toArray(Integer[]::new);


(에러)
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int[] arr = list.toArray(int[]::new);
// error: no suitable method found for toArray(int[]::new)

stream

primitive로 unboxing이 필요한 경우 편리

List<String> list = Arrays.asList("A", "B", "C", "D", "E");
String[] arr = list.stream().toArray(String[]::new);


(primitive unboxing)
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int[] arr = list.stream().mapToInt(Integer::intValue).toArray();

List 요소 삭제하기

loop를 돌면서 List 요소 삭제 시 삭제할 때마다 size가 줄어들어 index가 고정되지 않기 때문에 예상대로 동작하지 않음.
항상 0번째의 값을 삭제하게 해도 마찬가지. size가 계속 감소하기 때문에 for문에서 i의 값이 size이상이 되는 경우 loop가 멈추게 됨.
--> 초기의 size값을 캡쳐하여 loop의 반복횟수를 고정

(오류)
List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
for (int i = 0; i < list.size(); i++) {
	list.remove(i);
}


(정상)
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);
}


출처 : 프로그래머스 스쿨 "[JAVA] 어서와! 자료구조 알고리즘은 처음이지?"

profile
친절한 개발자

0개의 댓글