List 인터페이스는 배열과 같이 객체를 일렬로 늘어놓은 구조를 가짐
객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동으로 인덱스가 부여되고, 인덱스로 객체를 검색, 추가, 삭제할 수 있는 등의 여러 기능을 제공함
List인터페이스에서 사용 가능한 메서드 + 컬렉션메서드도 상속받기때문에 사용가능
ArrayList에 객체를 추가하면 객체가 인덱스로 관리된다는 점에서 배열과 유사함
그러나 배열은 생성될 때 크기가 고정되며, 크기를 변경할 수 없는 반면, ArrayList는 저장 용량을 초과하여 객체들이 추가되면, 자동으로 저장용량이 늘어나게 됨.
리스트 계열 자료구조의 특성을 이어받아 데이터가 연속적으로 존재하기때문에 데이터의 순서가 유지 된다.
저장할 객체 타입을 타입 매개변수(제네릭)으로 표기하고 기본 생성자를 호출한다.
ArrayList<타입 매개변수> 객체명 = new ArrayList<타입 매개변수>(초기 저장 용량);
ArrayList<String> container1 = new ArrayList<String>();
// String 타입의 객체를 저장하는 ArrayList 생성
// 초기 용량이 인자로 전달되지 않으면 기본적으로 10으로 지정됩니다.
ArrayList<String> container2 = new ArrayList<String>(30);
// String 타입의 객체를 저장하는 ArrayList 생성
// 초기 용량을 30으로 지정하였습니다.
ArrayList에 객체를 추가하면 인덱스 0부터 차례대로 저장된다.
특정 인덱스의 객체를 제거하면, 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨진다.
빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다 LinkedList를 사용하는 것이 좋음.
public class Main {
public static void main(String[] args) throws IOException {
// ArrayList를 생성하여 list에 할당
ArrayList<String> list = new ArrayList<String>();
// String 타입의 데이터를 ArrayList에 추가
list.add("Java");
list.add("egg");
list.add("tree");
// 저장된 총 객체 수 얻기
int size = list.size();
// 0번 인덱스의 객체 얻기
String skill = list.get(0);
// 저장된 총 객체 수 만큼 조회
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
System.out.println(i + ":" + str);
}
// for-each문으로 순회
for (String str : list) {
System.out.println(str);
}
// 0번 인덱스 객체 삭제
list.remove(0);
for (String str : list) {
System.out.println(str);
}
}
}
0:Java
1:egg
2:tree
Java
egg
tree
egg
tree
LinkedList 컬렉션은 데이터를 효율적으로 추가, 삭제, 변경하기 위해 사용함
배열에는 모든 데이터가 연속적으로 존재하지만, LinkedList에는 불연속적으로 존재하며, 이 데이터는 서로 연결(link)되어있다.
LinkedList에서 데이터를 삭제하려면, 삭제하고자 하는 요소의 이전 요소가 삭제하고자 하는 요소의 다음 요소를 참조하도록 변경하면 됨. 링크를 끊어주는 방식이라고 생각하면 편하다.
배열처럼 데이터를 이동하기 위해 복사할 필요가 없기 때문에 처리 속도가 훨씬 빠르다.
데이터를 추가할 때에도 마찬가지로, 새로운 요소를 추가하고자 하는 위치의 이전 요소와 다음 요소 사이에 연결해주면 됨.
이전 요소가 새로운 요소를 참조하고, 새로운 요소가 다음 요소를 참조하게 만들면 됨.
ArrayList에서 데이터를 추가 또는 삭제하려면 그림과 같이 다른 데이터를 복사해서 이동해야 함.
ArrayList에 객체를 순차적으로 저장할 때는 데이터를 이동하지 않아도 되므로 작업 속도가 빠르지만, 중간에 위치한 객체를 추가 및 삭제할 때에는 데이터 이동이 많이 일어나므로 속도가 저하된다.
인덱스가 n인 요소의 주소값을 얻기 위해서는 배열의 주소 + n * 데이터 타입의 크기를 계산하여 데이터에 빠르게 접근이 가능하기 때문에 검색(읽기) 측면에서는 유리하다.
데이터를 순차적으로 추가하거나 삭제하는 경우
중간에 데이터를 추가하거나, 중간에 위치하는 데이터를 삭제하는 경우
중간에 위치하는 데이터를 추가하거나 삭제하는 경우
데이터 검색할 때에는 시작 인덱스에서부터 찾고자하는 데이터까지 순차적으로 각 노드에 접근해야 하기 때문에 데이터 검색에 있어서는 ArrayList보다 상대적으로 속도가 느리다.
데이터의 잦은 변경이 예상된다면 LinkedList를, 데이터의 개수가 변하지 않는다면 ArrayList를 사용한다