Collection<E> 인터페이스
- List와 Set의 상위인터페이스로 컬렉션의 기본적인 기능들을 모아놓은 인터페이스
- 제네릭으로 저장할 데이터의 자료형을 지정할 수 있으며, 생략시 Object로 설정됩니다.
- 주요 메소드
리턴 / 메소드명 및 설명
boolean / add(E e) : 지정한 데이터(객체 : e)를 추가
boolean / addAll(Collection<? extends E> c) : 지정한 컬렉션을 추가합니다.(제네릭 지정시 E와 관련된 데이터를 가진 컬렉션만 가능)
void / clear() : 컬렉션의 모든 데이터를 삭제
boolean / contains(Object o) : 컬렉션에 지정한 객체(o)가 존재하는지 여부
boolean / containsAll(Collection<?> c) : 지정한 컬렉션(c)이 존재하는지 여부
boolean / equals(Object o) : 동일한 컬렉션인지 여부
boolean / isEmpty() : 컬렉션이 비어있는지 여부
Iterator<E> / iterator() : 컬렉션의 iterator를 리턴
boolean / remove(Object o) : 지정된 객체(o)를 삭제
boolean / removeAll(Collection<?> c) : 지정된 컬렉션(c)을 삭제
boolean / retainAll(Collection<?> c) : 지정된 컬렉션(c)에 포함된 객체들만 남기고, 나머지 객체들은 삭제(삭제가 되었다면 true, 아니면 false를 리턴)
int / size() : 컬렉션에 저장된 객체의 개수를 리턴
Object[] / toArray() : 컬렉션을 Object배열로 리턴
<T> T[] / toArray(T[] a) : 제네릭으로 지정된 <T>형 배열(a)에 컬렉션의 데이터를 담아 리턴
List<E> 인터페이스
- Collection인터페이스를 상속받은 인터페이스로 Collection인터페이스의 메소드들을 자유롭게 사용할 수 있습니다.
public interface List<E> extends Collection<E>
- 순서가 있는(저장순서를 유지) 컬렉션으로 데이터의 중복을 허용합니다.
- 주요 메소드 : Collection인터페이스에서 상속받은 메소드는 제외
리턴 / 메소드명 및 설명
void / add(int index, E element) : 지정된 위치(index)에 객체(element)를 추가
boolean / addAll(int index, Collection<? extends E> c) : 지정된 위치(index)에 컬렉션(c)에 포함된 객체들을 추가
E / get(int index) : 지정된 위치(index)의 데이터를 리턴
int / indexOf(Object o) : 지정한 객체(o) 위치를 찾아 인덱스를 리턴(못 찾으면 -1을 리턴)
int / lastIndexOf(Object o) : 지정한 객체(o)의 위치를 뒤에서부터 찾아 인덱스를 리턴(못 찾으면 -1을 리턴)
ListIterator<E>/ listIterator() : : ListInterator를 리턴(List 전용)
E / remove(int index) : 지정된 위치(index)의 객체를 삭제 후, 삭제된 객체 리턴
E / set(int index, E element) : 지정된 위치(index)에 객체(element)를 저장 - 기존의 객체는 삭제됨
List<E> / subList(int fromIndex, int toIndex) : 컬렉션에서 fromIndex부터 toIndex - 1까지 잘라내어 List로 리턴
ArrayList<> 클래스
- 배열과 가장 비슷한 컬렉션으로 기존의 Vector를 개선한 클래스
- 가장 많이 사용되는 컬렉션으로 Object형 객체들을 저장하는 컬렉션
- 생성자
ArrayList() : 크기가 0인 ArrayList를 생성
ArrayList(collection<? extends E> c) : 지정된 컬렉션(c)를 기반으로 ArrayList를 생성
ArrayList(int initialCapacity) : initialCapacity를 초기용량으로 하는 ArrayList를 생성
- 주요 메소드 : Collection과 List 인터페이스에서 상속받은 메소드는 제외
리턴 / 메소드 및 설명
void / ensurecapacity(int minCapacity) : ArrayList의 용량을 최소한 minCapacity만큼 유지하도록 함
void / removeRange(int fromIndex, int toIndex) : formIndex부터 toIndex - 1까지 삭제
void / trimToSize() : ArrayList의 빈 공간을 삭제
.
.
ArrayList는 컬렉션과 리스트를 상속하므로 위에 있는 메소드들은 모두 사용가능하다
그러면 간단하게 기본적인 ArrayList를 실습해보자
import java.util.*;
class ArrayListEx1{
public static void main(String[] args) {
ArrayList list1 = new ArrayList(10);
// 10개의 공간을 가진 ArrayList를 생성
list1.add(new Integer(5));
list1.add(new Integer(4));
list1.add(new Integer(2));
list1.add(new Integer(0));
list1.add(new Integer(1));
list1.add(new Integer(3));
// list1에 데이터(객체)를 추가
ArrayList list2 = new ArrayList(list1.subList(1, 4));
// list1.subList(1, 4) : list1을 1 부터 (4 - 1)까지 잘라냄
// 잘라낸 List를 이용하여 ArrayList인 list2를 생성
print(list1, list2);
// list1 : [5, 4, 2, 0, 1, 3]
// list2 : [4, 2, 0]
Collections.sort(list1);
Collections.sort(list2);
// list1과 list2를 오름차순 정렬 시킴
print(list1, list2);
// list1 : [0, 1, 2, 3, 4, 5]
// list2 : [0, 2, 4]
System.out.println("list1.containsAll(list2) : " + list1.containsAll(list2)); // true
// list1 안에 list2의 모든 데이터가 들어있는지 여부
list2.add("B");
list2.add("C");
// list2의 가장 뒤에 문자열 "B"와 "C"를 추가
list2.add(3, "A");
// list2의 3번 인덱스 자리에 "A"를 삼입(원래의 데이터는 뒤로 밀림)
print(list1, list2);
// list1 : [0, 1, 2, 3, 4, 5]
// list2 : [0, 2, 4, A, B, C]
list2.set(3, "AA");
// list2의 3번 인덱스 자리의 데이터를 "AA"로 변경
print(list1, list2);
// list1 : [0, 1, 2, 3, 4, 5]
// list2 : [0, 2, 4, AA, B, C]
System.out.println("list1.retainAll(list2) : " + list1.retainAll(list2)); // true
// list1에서 list2의 데이터와 같은 데이터들만 남기고 삭제
print(list1, list2);
// list1 : [0, 2, 4]
// list2 : [0, 2, 4, AA, B, C]
for (int i = list2.size() - 1; i >= 0 ; i-- ){
// i에 list2의 마지막 인덱스번호부터 0번까지 돌면서 삭제를 실행
// 삭제는 거꾸로 돌면서 작업해야 효열적임
if (list1.contains(list2.get(i))){
// list2에서 i인덱스에 해당하는 데이터가 list1에 있으면
list2.remove(i);
// list2의 i인덱스 데이터를 삭제
}
} // removeAll()메소드를 구현한 for문
print(list1, list2);
// list1 : [0, 2, 4]
// list2 : [AA, B, C]
}
public static void print(ArrayList list1, ArrayList list2){
System.out.println("list1 : " + list1);
System.out.println("list2 : " + list2);
System.out.println();
}
}
.
.
import java.util.*;
class ArrayListEx2{
public static void main(String[] args) {
final int LIMIT = 10;
String src = "0123456789abcdefghijABCDEFGHIJ!@#$%^&*()ZZZ";
int len = src.length();
// src의 문자열들을 LIMIT를 개수로 잘라내어 list에 저장한 후 출력
List list1 = new ArrayList(len / LIMIT + 5);
List list2 = new ArrayList(len / LIMIT + 5);
for (int i = 0; i < len; i += LIMIT ){
if (i + LIMIT < len){
list1.add(src.substring(i, i + LIMIT));
} else{
list1.add(src.substring(i));
}
}
for (int i = 0 ; i < list1.size() ; i++){
System.out.println(list1.get(i));
}
// list1을 코딩하기위해 Brainstorming
list2.add(src.substring(0, 10));
list2.add(src.substring(10, 20));
list2.add(src.substring(20, 30));
list2.add(src.substring(30, 40));
list2.add(src.substring(40, len));
System.out.println(list2);
}
}
'Java > 본격 Java 컬렉션' 카테고리의 다른 글
[Java] Stack - Queue (0) | 2020.07.03 |
---|---|
[Java] LinkedList (0) | 2020.07.03 |
[Java] 컬렉션 프레임워크(Collection Framework) (0) | 2020.07.03 |
[Java] 제네릭(Generic) 심화 (0) | 2020.07.03 |
[Java] 제네릭 메소드 (0) | 2020.07.03 |