[Java] ArrayList

Lee GaEun·2024년 10월 24일

Java Note

목록 보기
2/3

ArrayList?

: 배열을 기반으로 한 컬렉션

  • 배열 기반 -> 인덱스를 통해 요소에 빠르게 접근 가능
    • 데이터 조회에 주로 쓰임
  • 데이터 삽입/삭제 시 내부에서 동적으로 배열의 길이를 조절함
    • 배열 중간에 빈 공간이 생기지 않도록 요소들의 위치 조정
    • 삽입/삭제 동작은 느림

ArrayList vs Array

1. ArrayList

  • 배열의 크기가 가변적임 : 동적할당
  • 메모리에 데이터의 주소를 연결하는 방식
  • 데이터 삭제 시, 앞뒤 요소들의 위치 조정
    • 데이터 사이에 빈공간을 허용하지 않음

2. Array

  • 처음 선언한 배열의 크기를 변경할 수 없음 : 정적할당
  • 메모리에 데이터를 직접 삽입하는 방식
  • 데이터 삭제 시, 해당 index는 null

ArrayList 사용법

1. ArrayList 객체 생성

ArrayList 패키지

  • import java.util.ArrayList;

AraayList 생성 메서드 구조

ArrayList<Integer> integers2 = new ArrayList<>(); // 타입, 용량 생략 가능

ArrayList<Integer> integers1 = new ArrayList<Integer>(); // 타입 지정
ArrayList<Integer> integers3 = new ArrayList<>(10); // 초기 용량(Capacity) 설정

ArrayList<Integer> integers4 = new ArrayList<>(integers1); // 다른 Collection값으로 초기화
ArrayList<Integer> integers5 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); // Arrays.asList()
  • ArrayList는 <>기호를 이용해 타입을 지정
    • <> : 제네릭(Generics)
    • 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법

2. ArrayList 요소 추가

객체를 생성할 때 지정한 타입의 데이터만 추가 가능

해당 메서드를 사용한 예시 코드

ArrayList<String> list1 = new ArrayList<>(5); // 용량 5으로 지정

list1.add("A");
System.out.println(list1.add("B"));	// true 출력
System.out.println(list1.size()); 	// 배열의 크기: 요소 개수 2 출력

ArrayList<String list2 = new ArrayList<>(5);
list2.add("C");
list2.add("D");


list1.addAll(list2);		// list1에 list2의 내용 추가
System.out.println(list1);	// [A, B, C, D] 출력

3. ArrayList 요소 삽입

원하는 인덱스에 데이터 삽입 가능

  • 데이터 중간에 요소를 삽입하면, 기존 요소들이 한 칸씩 밀려 공간을 생성
  • 따라서, ArrayList가 클수록 비효율적임

해당 메서드를 사용한 예시 코드

ArrayList<String> list = new ArrayList<>(8); 

list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");

// 3번째 인덱스 자리에 요소 삽입
list.add(3, "A");

System.out.println(list); // [1, 2, 3, A, 4, 5]

4. 요소 삽입 시 주의사항

  • 위치를 지정하여 삽입할 때 인덱스가 리스트의 용량을 넘지 않도록 해야 함

  • IndexOutOfBoundsException 예외 발생
    - 리스트 용량을 초과하는 인덱스에 요소를 넣는 경우
    - 용량은 맞췄으나, 배열에 빈공간을 두고 요소를 넣는 경우

    : 리스트의 용량(capacity)은 8이지만, 논리적인 공간(size)는 5이므로,
    7번째 인덱스에 값을 삽입하는 것은 논리적 공간을 넘기 때문에 불가능함

5. ArrayList 요소 삭제

해당 메서드를 사용한 예시 코드

ArrayList<String> list = new ArrayList<>(8);

list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");

// 2번째 인덱스 자리의 요소 삭제
list.remove(2);

System.out.println(list); // [1, 2, 4, 5]

// 만약 모든 값을 제거하려면 반복문을 사용하는 것이 아니라
// 간단히 clear() 메소드를 사용하면 된다.
list.clear();

System.out.println(list); // []

6. ArrayList 요소 검색

해당 메서드를 사용한 예시 코드

ArrayList<String> list1 = new ArrayList<>();
list1.add("A");
list1.add("B");
list1.add("C");
list1.add("A");

// list에 A가 있는지 검색 : true
list1.contains("A"); 

// list에 A가 있는지 순차적으로 검색하고 index를 반환 (만일 없으면 -1)
list1.indexOf("A"); // 0

// list에 A가 있는지 역순으로 검색하고 index를 반환 (만일 없으면 -1)
list1.lastIndexOf("A"); // 3

7.ArrayList 요소 얻기

해당 메서드를 사용한 예시 코드

ArrayList<String> list = new ArrayList<>(18); 

list.add("P");
list.add("r");
list.add("o");
list.add("g");
list.add("r");
list.add("a");
list.add("m");

// 개별 단일 요소 반환
list.get(0); 		// "P"
list.get(3);		// "g"

// list[0] ~ list[6] 범위 반환
list.subList(0, 7); // [P, r, o, g, r, a, m]

// list[3] ~ list[6] 범위 반환
list.subList(3, 7); // [g, r, a, m]

8. ArrayList 요소 변경

해당 메서드를 사용한 예시 코드

ArrayList<String> list = new ArrayList<>(18); 

list.add("data1");
list.add("data2");
list.add("data3");

// index 1번의 데이터를 문자열 "setData"로 변경한다.
list.set(1, "setData");

System.out.println(list);	// [data1, setData, data3]

9. ArrayList 용량 확장

해당 메서드를 사용한 예시 코드

ArrayList<String> list1 = new ArrayList<>(5); // 용량(capacity)를 5으로 설정

// 용량 5을 넘은 요소 7개 추가
list1.add("A");
list1.add("B");
list1.add("C");
list1.add("D");
list1.add("E");
list1.add("F");
list1.add("G");

// 크기(size)는 7 : 자동으로 용량이 증가되어 데이터를 적재함(오버헤드 발생)
list1.size();

// --------------------------------------------------

ArrayList<String> list2 = new ArrayList<>(5); // 용량(capacity)를 5으로 설정

// 용량 5에 맞게 요소 5개 추가
list2.add("A");
list2.add("B");
list2.add("C");
list2.add("D");
list2.add("E");

// ensureCapacity() 메소드를 이용해 용량 확장
list2.ensureCapacity(10);

// 용량 확장 후 요소 추가
list2.add("F");
list2.add("G");

// 미리 확장해 오버헤드 발생하지 않았다.
// 따라서, 사용될 데이트의 개수를 미리 알고있는 경우엔 처음에 그 값으로 선언해주면 된다.
System.out.println(list); // [1, 2, 3, 4, 5, 6, 7]

10. ArrayList 정렬

sort() 메소드는 정렬된 값을 반환하는 게 아니라, 원본 리스트 자체를 변경시킴
업로드중..

Comparator 패키지

  • import java.util.Comparator;

해당 메서드를 사용한 예시 코드

import java.util.Comparator;

ArrayList<String> list1 = new ArrayList<>();
list1.add("3");
list1.add("2");
list1.add("1");

// 오름차순 정렬
list1.sort(Comparator.naturalOrder());
System.out.println(list1);	// [1, 2, 3]

// 내림차순 정렬
list1.sort(Comparator.reverseOrder());
System.out.println(list1);	// [3, 2, 1]

참고 : https://velog.io/@hamsangjin/JAVA-ArrayList%EB%9E%80

profile
I will give it my all (๑•̀o•́๑)ง

0개의 댓글