Java

리스트(List) & 셋(Set)

good_da22 2022. 7. 29. 00:07

List


중복을 허용 하면서 저장순서 유지


List Inferface 주요 메서드


추가


  • void add(int index, Object element)

    지정된 위치(index)에 객체(element) 추가

  • boolean addAll(int index, Collection<? extends E> c)

    지정된 위치(index)에Collection 객체를 추가

    작업을 성공하면 true, 그렇지 않으면 false


조회


  • Object get(int index)

    지정된 위치(index)에 있는 객체를 반환

  • int indexOf(Objec o)

    지정된 객체의 위치(index)를 List의 첫 번째 요소부터 찾아 반환

  • int lastIndexOf(Object o)

    지정된 객체의 위치(index)를 List의 마지막 요소부터 찾아 반환

  • ListIterator listIterator()

    List 객체에 접근할 수 있는 ListIterator를 반환


삭제


  • Object remove(int index)

    지정된 위치(index)에 있는 객체를 삭제하고 삭제된 객체를 반환


수정


  • Object set(int index, Object element)

    지정된 위치(index)에 객체(element)를 저장


기타


  • List subList(int fromIndex, int toIndex)

    지정된 범위(fromaIndex ~ toIndex)에 있는 객체를 List로 반환

  • void sort(Comparator c)

    지정된 비교자(comparator)로 List를 정렬



ArrayList


배열의 장점

  • 가장 기본적인 형태의 자료구조, 간단하며 사용이 쉽다.
  • 인덱스를 통해 접근 속도가 빠르다.

배열의 단점

  • 크기를 변경할 수 없다.
  • 추가 데이터를 위해 새로운 배열을 만들고 복사해야한다.
  • 비 순차적 데이터 추가, 삭제에 많은 시간이 걸림

배열을 사용하는 ArrayList 역시 배열의 장단점을 가져간다.

Object 배열을 사용해 데이터를 순차적으로 저장

배열에 저장할 공간이 없으면 보다 큰 새로운 배열을 생성에 기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음 저장


자료 삭제 시 주의 사항


for (int i = 0; i < 리스트 길이; i++) {
    if (삭제 조건) {
        리스트.remove(i);
        i--;
    }
}

요소가 삭제될 때마다 빈 공간을 채우기 위해 나머지 요소들이 자리 이동

제어변수를 감소(index 차감) 하며 삭제해야 자리이동이 발생해도 영향을 받지 않고 작업이 가능


마지막 요소부터 접근해 자연스럽게 해결 가능

for (int i = 리스트 길이; i >= 0; i--) {
    if (삭제 조건) {
        리스트.remove(i);
    }
}

forEach 문 사용 주의사항


forEach 문은 Collection 크기가 변하면 안된다.

잘못된 인덱스에 접근하여 예외 발생 가능

추가, 삭제 없이 조회 시에만 사용 (읽기 전용)

for (객체 타입 : 리스트) {
    // 리스트.add() 금지
    // 리스트.remove() 금지
}



LinkedList


각 요소를 Node로 정의하고 Node는 다음 요소의 참조 값데이터로 구성된다.

각 요소가 다음 요소의 링크 정보를 가지며 연속적으로 구성될 필요가 없다.

데이터가 많아질수록 데이터를 읽어오는 접근시간(access time)이 길어진다.



ArrayList vs LinkedList


  • 순차적으로 추가 / 수정 / 삭제하는 경우

    ArrayList 가 LinkedList 보다 빠르다.

  • 비 순차적(중간 데이터) 으로 추가 / 수정/ 삭제하는 경우

    ArrayList 가 LinkedList 보다 느리다.

  • 조회하는 경우

    ArrayList 가 LinkedList 보다 빠르다.


사용 목적에 따라 선택

소량의 데이터를 사용할 경우 유의미한 차이는 없다.


정적인 데이터 활용, 단순히 데이터 조회 : ArrayList

동적인 데이터 추가, 삭제가 많은 작업 : LinkedList



Set


순서를 유지하지 않고 데이터 중복을 허용하지 않는다.


순서가 없어 데이터를 구별한 Index가 없어 중복이 허용되지 않는다.

동일한 데이터(객체)의 equals()true를 리턴하고 hashCode()값이 같다.

Set은 Index가 없어 remove()를 통해 살제할 때 동일한 객체를 매개변수로 넘겨줘야 한다.