ArrayList란?
Array List는 배열을 이용해서 리스트를 구현한 것을 의미한다.
장점은 내부적으로 배열을 이용하기 때문에 인덱스를 이용해서 접근하는 것이 빠르다.
하지만 데이터의 추가와 삭제가 느리다.
List 인터페이스의 구현 클래스이며, ArrayList에 객체를 추가하면 객체가 인덱스로 관리된다.
크기가 가변적으로 변하는 선형 리스트이다.
일반 배열과 ArrayList는 순차리스트이며, 인덱스로 객체를 관리한다는 점에서 유사하나 큰 차이점이 있다.
배열은 생성시 크기가 고정되고 사용 중에 크기를 변경할 수 없지만,
ArrayList는 저장 용량(capacity)을 초과한 객체들이 들어오면 자동적으로 저장 용량(capacity)이 늘어난다.
List<E> list = new ArrayList<E>();
데이터 추가
index가 1, value가 50인 element를 추가할 시 다음과 같이 값이 밀려나는 과정이 필요하다.
데이터 삭제
index가 2, value가 30인 element를 삭제할 시 다음과 같이 값을 땡기는 과정이 필요하다.
Array와 비교
비교 군 | Array | ArrayList |
크기 | 초기화시 고정 | 초기화시 사이즈를 표시하지 않음. 사이즈가 동적이다. |
실행 속도 | 초기화 시 메모리(heap)에 할당되어 속도가 빠름 |
추가시 메모리를 재할당하여 속도가 느림 |
크기 변경 | 변경 불가 | 추가, 삭제 가능 |
다차원 | 가능 | 불가능 |
타입 | primitive type(int,byte, char etc), object | object elemnet만 가능 |
제네릭 | 사용 불가능 | 사용 가능(타입 안정성 보장) |
길이 | length 변수 | size() 메서드 |
변수 추가 | assignment 연산자 사용 | add() 메소드 사용 |
언제 사용?
배열과 비교하면
데이터의 크기를 동적으로 변경할 때
제네릭을 이용한 타입 안정성 보장이 필요할 때
제네릭이란?
클래스 내부에서 사용할 데이터 타입을 인스턴스 생성시 확정하는 것을 제네릭이라 한다.
제네릭은 다양한 타입의 객체를 다루는 메소드 및 컬렉션 클래스를 컴파일 시, 타입 체크를 해주는 기능을 한다.
객체 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄인다.
LinkedList와 비교하면
객체 삭제와 삽입이 최소한으로 사용되며 검색이 많이 요구될 때
(맨 마지막에 객체를 추가하는 경우는 ArrayList가 더 좋은 성능을 발휘)
JAVA API
/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class ArrayList
{
public static void main (String[] args) throws java.lang.Exception
{
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);
System.out.println("add(값)");
System.out.println(numbers);
numbers.add(1, 50);
System.out.println("\nadd(인덱스, 값)");
System.out.println(numbers);
numbers.remove(2);
System.out.println("\nremove(인덱스)");
System.out.println(numbers);
System.out.println("\nget(인덱스)");
System.out.println(numbers.get(2));
Iterator<Integer> it = numbers.iterator();
System.out.println("\niterator");
while(it.hasNext()){
int value = it.next();
if(value == 30){
it.remove();
}
}
System.out.println(numbers);
System.out.println("\nfor each");
for(int value : numbers){
System.out.println(value);
}
}
}
add(값)
[10, 20, 30, 40]
add(인덱스, 값)
[10, 50, 20, 30, 40]
remove(인덱스)
[10, 50, 30, 40]
get(인덱스)
30
iterator
[10, 50, 40]
for each
10
50
40
코드 구현
github.com/devjun63/DataStructure/blob/master/src/list/arraylist/implementation/ArrayList.java
github.com/devjun63/DataStructure/blob/master/src/list/arraylist/implementation/Main.java
참조
opentutorials.org/module/1335/8709
velog.io/@humblechoi/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-Array-vs-ArrayList
'Computer Science > DataStructure' 카테고리의 다른 글
Implement Linked List (0) | 2021.04.26 |
---|---|
Linked List (연결 리스트) (0) | 2021.03.07 |
List (리스트) (0) | 2021.02.25 |
Array (배열) (0) | 2021.02.25 |
Data Structure란? (0) | 2021.02.25 |