이 글은 남궁성 님의 Java의 정석 책을 바탕으로 정리한 글입니다.
인터페이스 | 인터페이스 | 특징 |
Collection | List | 순서 유지 O, 중복 O |
구현 클래스: ArrayList, LinkedList, Stack, Vector | ||
Set | 순서 유지 X, 중복 X | |
HashSet, TreeSet | ||
Map | 키와 값의 쌍으로 이루어진 데이터 집합 순서 유지 X, 키: 중복 X, 값: 중복 O |
|
HashMap, TreeMap, Hagtabel, Poperties |
※ Collection: 인터페이스, Collections: 클래스
ArrayList
- Object 배열을 이용해서 데이터를 순차적 저장
- 공간이 없으면 새로운 배열을 생성해서 복사한 후 저장
- 객체를 인덱스로 관리
- 반복문을 통해 요소 삭제 시, 빈 공간을 채우기 위해 자리 이동이 발생하므로 뒤에서부터 삭제해야 올바른 결과를 얻을 수 있다
- 객체 삭제와 삽입이 빈번할 경우, LinkedList를 사용하기!
메서드 | 설명 |
ArrayList() | 크기가 10인 리스트 생성 |
ArrayList(Colloection c) | 주어진 컬렉션이 저장된 리스트 생성 |
boolean add(Object o) | 마지막 위치에 객체 추가 |
void add(int index, Object element) | 지정 위치에 객체 저장 |
Object set(int index, Object element) | 주어진 위치에 객체 저장 |
Object get(int index) | 주어진 위치에 저장된 객체 반환 |
Object remove(int index) | 지정 위치의 객체 제거 |
void clear() | |
int indexOf(Object o) int lastIndexOf(Object o) |
순방향 / 역방향으로 객체 위치 탐색 |
List subList(int fromIndex, int toIndex) | from ~ to |
LinkedList
배열의 단점(크기 변경 불가, 추가와 삭제 비효율적)을 보완, 참조의 연결로 구성되어서 속도가 빠르다
더블 링크드 리스트: 링크드 리스트의 단점(이전 요소의 접근 어려움)을 보완
더블 써큘러 링크드 리스트: 첫 번째 요소 - 마지막 요소 연결
ArrayList vs. LinkedList
ArrayList
· 데이터를 순차적 추가, 삭제할 때
순차적 삭제: 0번 인덱스부터
순차적 삭제: 마지막 인덱스부터 (내부적으로 단순히 null로 바꿈)
· 데이터를 검색하는(읽는) 경우
인덱스 n인 요소의 주소값(배열의 주소 + n * 데이터 타입의 크기)으로 접근하므로 빠르다
LinkedList
· 중간에 데이터 추가, 삭제 시
Stack과 Queue
Stack: LIFO, ArrayList
Queue: FIFO, LinkedList, 인터페이스라 객체 생성 불가
Stack st = new Stack();
Queue q = new LinkedList();
//push, pop
//offer, poll
메서드 | 설명 |
Object peek() | Stack이나 Queue에서 맨 위의 객체 반환 |
Object push(Object item) | Stack에 객체 저장 |
Object pop() | Stack에서 객체 꺼냄, 비어 있으면 예외 발생 |
boolean ofter(Object o) | Queue에 객체 저장 |
Object poll() | Queue에서 객체 꺼냄, 비어 있으면 null |
Iterator
Collection 인터페이스의 iterator()를 호출하면 Iterator 타입 인스턴스가 반환
컬렉션에 저장된 요소 읽기, 이와 같이 표준화하면 재사용성 극대화
1회성이므로 사용 후 다시 얻어 와야 한다
List 인터페이스 기반에서 이전 요소를 불러 올 일이 있다면 양방향인 ListIterator를 사용하자
메서드 | 특징 |
boolean hasNext() | 읽을 요소가 있는지 확인 |
Object next() | 다음 요소 읽기 |
remove() |
Collection c = new ArrayList();
Iterator it = c.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Comparator와 Comparable
Comparator: 기본 정렬 기준 구현
Comparable: 다른 기준으로 정렬하고 싶을 때
HashSet
순서 유지 X, 중복 허용 X
순서 유지 O, 중복 허용 X : LinkedHashSet
String인스턴스와 Integer인스턴스는 서로 다른 객체이므로 중복으로 간주하지 않는다
add 메서드는 저장할 객체의 equals()와 hashCode()를 호출한다(extends Object)
객체 중복을 정확히 검색하려면 equals()와 hashCode()가 오버라이딩 되어 있어야 한다
메서드 | 설명 |
boolean add(Object o) | 새로운 객체 저장 |
void clear() | 모든 객체 삭제 |
boolean remove(Object o) | 지정 객체 삭제 |
boolean retainAll(Collection c) | 조건부 삭제 |
TreeSet
이진 검색 트리: 범위 탐색과 정렬에 유리
왼쪽: 부모보다 작은 값, 오른쪽: 부모보다 큰 값
1. 데이터가 많아질수록 데이터 추가, 삭제에 시간이 더 걸린다 (root부터 비교해야 하므로)
2. 모든 노드가 최대 2개의 하위 노드를 가짐 - LinkedList의 변형
3. 사전순 정렬
메서드 | 설명 |
boolean add(Object o) | 새로운 객체 저장 |
Object first() | 정렬된 순서에서 첫 번째 객체 반환 |
Object last() | |
Object higher(Object o) | 지정 객체보다 큰 값을 가진 객체 중 가까운 값의 객체 |
SortedSet headSet(Object toElement) | 지정 객체보다 작은 값의 객체 반환 |
SortedSet subSet(Object from, Object to) | 범위 검색의 결과 반환 (to는 포함 X) |
package Collection;
import java.util.TreeSet;
public class TreeSetExample {
public static void main(String[] args) {
TreeSet<String> workers = new TreeSet<>();
workers.add("Lee Java");
workers.add("Park Hacker");
workers.add("Kim Coding");
System.out.println(workers); //[Kim Coding, Lee Java, Park Hacker]
System.out.println(workers.first()); //Kim Coding
System.out.println(workers.last()); //Park Hacker
System.out.println(workers.higher("Lee")); //Lee Java
System.out.println(workers.subSet("Kim", "Park")); //[Kim Coding, Lee Java]
}
}
HashMap
순서 유지 X, 중복(키 X, 값 O)
순서 유지 O : LinkedHashMap
해싱 기법으로 데이터를 저장, 데이터가 많아도 검색이 빠르다
직접 iterator()를 호출할 수 없으므로 keySet()이나 entrySet()을 이용한다
메서드 | 설명 |
Object put(Object key, Object value) | 저장 |
boolean ContainKet(Object key) | |
Object remove(Object key) | |
Object get(Object key) | |
Set entrySet() | 키, 값의 형태를 Set에 저장 |
Set ketSet() | |
Collection values() |
HashTable
HashMap과는 스레드 차이
'Back-End > Java' 카테고리의 다른 글
조건문과 반복문 문제 풀이 (0) | 2022.07.05 |
---|---|
지네릭스, 열거형, 애너테이션 (0) | 2022.02.21 |
예외 처리(exception handling) (0) | 2021.12.26 |
객체지향 프로그래밍 Ⅱ (0) | 2021.12.16 |
객체지향 프로그래밍 Ⅰ (0) | 2021.12.02 |
댓글