객체를 그룹 단위의 데이터로 저장하는 기본적인 자료구조들의 모음
다수의 데이터를 그룹으로 묶어 관리할 수 있으므로 프로그래밍이 보다 편리해지고, 코드의 재사용성을 늘릴 수 있다.
컬렉션 프페임워크의 주요 인터페이스는 List, Set, Map이 있다.
인터페이스 분류 | 특징 | 구현클래스 | |
---|---|---|---|
Collection | List | 순서를 유지하고 저장 중복 저장 가능 | ArrayList, Vector LinkedList |
Set | 순서를 유지하지 않고 저장 중복 저장 안됨 | HashSet, TreeSet | |
Map | 키와 값의 쌍으로 저장 키는 중복 안 됨 값은 중복 저장 가능 | HashMap, Hashtable TreeMap, LinkedHashMap |
객체를 일렬로 늘어놓은 구조
객체를 인덱스로 관리
객체를 저장하면 자동 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공
기능 | 메소드 | 설명 |
---|---|---|
객체 추가 | booelan add(E, e) | 주어진 객체를 맨 끝에 추가 |
void add(int index, E element) | 주어진 인덱스에 객체 추가 | |
set(int index, E element) | 주어진 인덱스에 저장된 객체를 주어진 객체로 바꿈 | |
객체 검색 | boolean contains(Object o) | 주어진 객체가 저장되어 있는지 여부 확인 |
E.get(int index) | 주어진 인덱스에 저장된 객체를 리턴 | |
boolean isEmpty() | 컬렉션이 비어 있는지 조사 | |
int size() | 저장되어 있는 전체 객체 수를 리턴 | |
객체 삭제 | void clear() | 저장된 모든 객체를 삭제 |
E remove(int index) | 주어진 인덱스에 저장된 객체를 삭제 | |
boolean remove(Object o) | 주어진 객체를 삭제 |
일반 배열과 같이 인덱스로 객체를 관리
배열은 생성될 때 크기가 고정되어 변경을 할 수 없지만 ArrayList는 저장 용량을 초과하면 자동으로 저장 용량을 늘림
상당히 빠르고 크기를 마음대로 조절할 수 있는 배열
단방향 포인터 구조로 자료에 대한 순차적인 접근에 강점이 있다
List<기본타입> list = new ArrayList<기본타입>();
List<String> list = Arrays.asList("Apple", "Banana", "Orange");
test.collection.TestArrayList.java
01 package test.collection
02
03 import java.util.*;
04
05 public class TestArrayList {
06 private List<String> l = new ArrayList<String>();
07
08 public void testArrayList() {
09 l.add("Red"); // [Red]
10 l.add("Orange"); // [Red, Orange]
11 l.add(1, "Yellow"); // [Red, Yellow, Orange]
12 printList();
13
14 l.remove(2); // [Red, Yellow]
15 printList();
16
17 l.clear(); // []
18 System.out.println("List가 비었나요? " + l.isEmpty()); // true
19 }
20
21 public void printList() {
22 System.out.println(l);
23 }
24 }
test.main.Main.java
01 package test.main;
02
03 import test.collection.TestArrayList;
04
05 public class Main {
06 public static void main(String[] args) {
07 new TestArrayList().testArrayList();
08 }
09 }
------
[Red, Yellow, Orange]
[Red, Yellow]
List가 비었나요? true
ArrayList의 구 버전
ArrayList와 동일한 내부 구조를 가지고 있다
모든 메소드가 동기화 되어 있고 잘 쓰이지 않음
List<E> list = new Vector<E>();
ArrayList와는 달리 동기화 된 메소드로 구성되어 있어 멀티 스레드 환경에서 동시에 메소드들을 실행 할 수 없고, 하나의 스레드의 실행이 완료 되어야만 다른 스레드에서 실행 할 수 있다.
양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 빠른 성능을 보장
ArrayList와 사용 방법은 똑같지만 내부 구현이 인접 참조 링크를 체인처럼 관리
ArrayList는 객체가 중간 인덱스에 삭제되거나 삽입될 때 뒤의 객체들의 인덱스가 변경되지만, LinkedList는 중간 인덱스의 객체가 변경되더라도 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않음
삭제와 삽입이 빈번이 일어나는 경우 ArrayList보다 LinkedList가 좋은 성능을 발휘한다.
스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰임List<E> list = new LinkedList<E>();
test.collection.TestLinkedList.java
01 package test.collection;
02
03 import java.util.LinkedList;
04
05 public class TestLinkedList {
06 public TestLinkedList() {
07 }
08
09 public void testLinkedList() {
10 LinkedList<String> list = new LinkedList<String>();
11
12 list.add("포도"); // [포도]
13 list.add("딸기"); // [포도, 딸기]
14 list.add("복숭아"); // [포도, 딸기, 복숭아]
15 list.add("키위"); // [포도, 딸기, 복숭아, 키위]
16 printList(list);
17
18 list.set(0, "오렌지"); // [오렌지, 딸기, 복숭아] -> set으로 0번째 인덱스 변경
19 printList(list);
20
21 list.remove(1); // [오렌지, 딸기, 복숭아] -> remove로 1번째 인덱스 삭제
22 list.remove("키위"); // "키위" 데이터 삭제
23 printList(list);
24 }
25
26 public void printList(LinkedList<String> list) {
27 // 반복문을 이용한 LinkedList 출력
28 int num = list.size();
29 for(int cnt = 0; cnt < num; cnt++) {
30 String str = "[" + list.get(cnt) + "]";
31 System.out.print(str);
32 }
33 System.out.println();
34 }
35 }
test.main.Main.java
01 package test.main;
02
03 import test.collection.TestLinkedList;
04
05 public class Main {
06 public static void main(String[] args) {
07 new TestLinkedList().testLinkedList();
08 }
09 }
------
[포도][딸기][복숭아][키위]
[오렌지][딸기][복숭아][키위]
[오렌지][복숭아]