다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합
- 자료구조객체들은 제네릭을 사용하지 않으면 Object타입을 저장
1. 제네릭이라는 기법으로 만들어짐
- <E>, <K>, <V> 등을 타입매개변수라고 하고, 특정 타입만 다루지 않고
여러 종류의 타입을 지원하도록 컬렉션을 일반화(제네릭) 시키기 위해 사용
2. 컬렉션의 요소로는 객체만 가능
- 기본 타입을 넣을 경우 자동 박싱으로 wrapper클래스로 변환하여 삽입
데이터의 타입을 일반화(generalize)하는 것
- E : Element 컬렉션의 요소를 의미
- T : Type
- V : Value
- K : Key
가변 크기의 배열을 구현한 컬렉션 클래스
요소의 삽입, 삭제에 따라 요소의 위치와 크기를 조절
public static void main(String[] args) {
Vector<Integer> v = new Vector<Integer>();
//벡터 맨 뒤에 삽입
v.add(5);
v.add(4);
v.add(-1);
//벡터 중간에 삽입(index,value)
v.add(2,100);
System.out.println("벡터 크기 : " + v.size());
System.out.println("백터 현재 용량 : " + v.capacity());
for (int i=0; i<v.size(); i++){
//get(i) 벡터의 i번째 값
int n = v.get(i);
System.out.println(n);
}
for (int i=0; i<v.size(); i++){
//elementAt(i) 벡터의 i번째 값
int n = v.elementAt(i);
System.out.println(n);
}
// addAll(Collection<E> c) : c의 모든 요소를 벡터의 맨 뒤에 추가
// clear : 벡터의 모든 요소 삭제
// contains(Object o) : 벡터가 o를 포함하고 있으면 true 반환
// indexOf(Object o ) : o와 같은 첫 번째 요소의 인덱스 리턴, 없으면 -1
// isEmpty() : 벡터가 비어 있으면 true
// remove(int index) : 인덱스의 요소 삭제
// remove(Object o) : o와 같은 첫 번째 요소 삭제
// removeAllElements : 벡터의 모든 요소 삭제 후 크기를 0으로 설정
// toArray() : 벡터의 모든 요소를 포함하는 배열 리턴
}
가변 크기의 배열을 구현한 컬렉션 클래스
Vector 클래스와 거의 동일하나 ArrayList는 스레드 간에 동기화를 지원하지 않아, 다수의 스레드가 동시에 요소를 삽입/삭제할 때 데이터가 훼손될 수 있음
하지만 멀티스레드 동기화로 인한 소요 시간이 없어 단일 스레드 응용에서는 더 효과적임
//예제
public static void main(String[] args) {
// ArrayList 생성
ArrayList<String> a = new ArrayList<String>();
// 키보드로부터 4개의 이름을 입력받아 ArrayList에 삽입
Scanner scanner = new Scanner(System.in);
for (int i=0;i<4;i++){
System.out.print("이름을 입력하세요>>");
String s = scanner.next();
// ArrayList 맨 뒤에 삽입
a.add(s);
}
// ArrayList에 들어 있는 모든 이름(요소) 출력
for (int i=0; i<a.size(); i++){
// get(i) : ArrayList의 i번째 요소 가져오기
String name = a.get(i);
System.out.print(name + " ");
}
// 가장 긴 이름 출력
int longestIndex = 0; // 가장 긴 이름의 인덱스 번호 저장
for (int i=0; i<a.size(); i++){
if(a.get(longestIndex).length() < a.get(i).length())
longestIndex = i;
}
System.out.println("\n가장 긴 이름은 : " + a.get(longestIndex));
scanner.close();
// ArrayList 메서드
// add(E element) : 맨 뒤에 element 삽입
// add(int index, E element) : index위치에 element 삽입
// addAll(Collection<E> c) : c의 모든 요소를 ArrayList의 맨 뒤에 추가
// clear : ArrayList의 모든 요소 삭제
// contains(Object o) : ArrayList가 o를 포함하고 있으면 true 반환
// elementAt(int index) : 인덱스의 요소 리턴
// get(int index) : 인덱스의 요소 리턴
// indexOf(Object o) : o와 같은 첫 번째 요소의 인덱스 리턴, 없으면 -1
// isEmpty() : ArrayList가 비어 있으면 true
// remove(int index) : 인덱스의 요소 삭제
// remove(Object o) : o와 같은 첫 번째 요소 삭제
// size() : ArrayList 크기 리턴
// toArray() : ArrayList의 모든 요소를 포함하는 배열 리턴
}
컬렉션에서 요소를 순차 검색할 때 사용하는 인터페이스
Iterator의 요소는 컬렉션의 매게 변수와 동일한 타입이어야 함
//예제
public static void main(String[] args) {
// 정수 값만 다루는 제네릭 벡터 생성
Vector<Integer> v = new Vector<>();
v.add(5);
v.add(4);
v.add(-1);
v.add(2, 100);
// Iterator를 이용하여 모든 정수 출력
Iterator<Integer> it = v.iterator(); // Iterator 생성
// 다음 요소가 남아있으면 true
while (it.hasNext()){
//next() 다음 요소 리턴
int n = it.next();
System.out.println(n);
}
// Iterator를 이용하여 모든 정수 더하기
int sum = 0;
// Iterator를 다시 설정해줘야 함
it = v.iterator();
while (it.hasNext()){
int n = it.next();
sum += n;
}
System.out.println("벡터에 있는 정수 합 : " + sum);
}
// Iterator 메소드
// hasNext() : 방문할 요소가 남아 있으면 true
// next() : 다음 요소 리턴
// remove() : 마지막으로 리턴된 요소 제거
키(Key)와 값(Value)이 한쌍으로 구성되는 요소를 다루는 컬렉션
해시함수를 이용해 데이터가 저장되는 위치를 결정
Hash코드를 이용한 자료구조는 Object의 equals()와 hashCode()를 구현해야 함
List 인터페이스를 구현한 클래스
Vector나 ArrayList와 비슷하지만 List 각 요소들을 양방향으로 연결한다는 차이가 있음