-
이것이 자바다 | 15장 컬렉션 프레임워크 (1)JAVA/이것이 자바다 2022. 7. 5. 15:06
컬렉션 프레임워크: 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 java.util 패키지에 컬렉션과 관련된 인터페이스와 클래스들을 포함시켜 놓은 것
15.2 List 컬렉션
- list 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조함
- null 도 저장이 가능함 (해당 인덱스는 객체 참조를 하지 않음)
1. ArrayList
- 저장용량을 초과한 객체들이 들어오면 자동적으로 저장 용량이 늘어남
- 객체를 추가하면 인덱스 0부터 저장됨
- 특정 인덱스의 객체를 제거하면 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨짐
=> 빈번한 삭제 삽입이 일어날 경우 사용이 바람직하지 않음 but, 인덱스 검색이나 맨 마지막에 객체를 추가하는 경우 좋음
import.java.util.*; public class ArrayListExample { public static void main(String[] args) { List<String> list = new ArrayList<String>(); // ArrayList 생성 list.add("Java"); // 객체 저장(추가) int size = list.size(); // 저장된 총 객체 수 얻기 String skill = list.get(2); // 2번 인덱스의 객체 얻기 list.remove(2); // 2번 인덱스 객체 삭제 } }
고정된 객체들로 구성된 List 생성
List<T> list = Arrays.asList(T... a);
< 사용 예 >
List<String> list1 = Arrays.asList("홍길동", "신용권", "김자바");
2. Vector
- ArrayList와 동일한 내부구조를 가짐
- ArrayList와 다른 점은 스레드가 안전하다는 것
*스레드가 안전한다: Vector은 동기화된 메소드로 구성되어 있기 때문에 멀티스레드가 동시에 이 메소드들을 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있음 -> 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제 가능
3. LinkedList
- ArrayList와 사용 방법은 같지만, 내부구조는 완전 다름
- 인접 참조를 링크해서 체인처럼 관리 -> 빈번한 객체 삽입과 삭제가 일어나는 곳에서 더 좋은 성능 발휘함
- 처음 생성될 때 어떠한 링크도 만들어지지 않기 때문에 내부는 비어 있다고 보면 됨
List<E> list = new LinkedList<E>();
< 사용 예 >
List<String> list = new LinkedList<String>();
∴ 끝에서부터 추가/삭제 하는 경우 ArrayList가 빠르지만, 중간에 추가/삭제할 경우 LinkedList가 빠름
15.3 Set 컬렉션
- 저장 순서를 유지하지 않음
- 중복 저장 불가능 -> 하나의 null만 저장 가능
Iterator<E> iterator() : 저장된 객체를 한 번씩 가져오는 반복자 리턴
=> Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없지만, 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자(Iterator)를 제공
< iterator 사용 예 >
Set<String> set = ...; Iterator<String> iterator = set.iterator();
< Iterator 인터페이스에 선언된 메소드 >
리턴 타입 메소드명 설명 boolean hasNext() 가져올 객체가 있으면 true를 리턴하고 없으면 false 리턴 E next() 컬렉션에서 하나의 객체를 가져옴 void remove() Set 컬렉션에서 객체를 제거 Set<String> set = ...; Iterator<String> iterator = set.iterator(); // 저장된 객체 수 만큼 반복 while(iterator.hasNext()) { // String 객체 하나를 가져옴 String str = iterator.next(); }
1. HashSet
< 사용 예 >
Set<String> set = new HashSet<String>();
hashCode()로 비교한 후, 동일한 해시코드가 있으면 equals() 로 다시 비교함 => 중복 저장 X
15.4 Map 컬렉션
메소드 설명 Set<Map.Entry<K, V>> entrySet() 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴 Set<K> keySet() 모든 키를 Set 객체에 담아서 리턴 Collection<V> values() 저장된 모든 값을 Collection 에 담아서 리턴 < Set<Map.Entry<K, V>> entrySet() 사용법 >
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
< 저장된 전체 객체를 대상으로 객체를 하나씩 얻는 2가지 방법 >
- keySet() 메소드로 모든 키를 Set 컬렉션으로 얻은 다음, 반복자를 통해 키를 하나씩 얻고 get() 메소드를 통해 값을 얻기
- entrySet() 메소드로 모든 Map.Entry 를 Set 컬렉션으로 얻은 다음, 반복자를 통해 Map.Entry를 하나씩 얻고 getKey()와 getValue() 메소드를 이용해 키와 값 얻기
1. HashMap
키와 값의 타입은 기본 타입을 사용할 수 없고 클래스 및 인터페이스 타입만 가능함
Map<String, Integer> map = new HashMap<String, Integer>();
2. Hashtable
- HashMap과 동일한 내부 구조를 가짐
- HashMap과의 차이점은 Hashtable은 동기화된 메소드로 구성되어있기 때문에 멀티 스레드가 동시에 이 메소드들을 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있음 => 스레드가 안전함
Map<String, Integer> map = new Hashtable<String, Integer>();
3. Properties
- Hashtable의 하위 클래스 - 다른점: 키와 값을String 타입으로 제한
'JAVA > 이것이 자바다' 카테고리의 다른 글
이것이 자바다 | 8장 인터페이스 (0) 2022.07.10 이것이 자바다 | 7장 상속 (0) 2022.07.07 이것이 자바다 | 11장 기본 API 클래스 (1) (0) 2022.07.04 이것이 자바다 | 6장 클래스 (0) 2022.06.27 이것이 자바다 | 5장 확인문제 9번 (0) 2022.06.27