컬렉션 프레임워크(Collection Framework)
컬렉션 : 사전적의미로 요소(객체)를 수집해 저장하는 것
전부 heap에 들어간다.
배열의 문제점
저장할 수있는 객체 수가 배열을 생성할 때 결정
→ 불특정 다수의 객체를 저장하기엔 문제
객체를 삭제했을 때 해당 인덱스가 비게됨
→ 낱알이 덤성덤성 빠진 옥수수가 될 수 있다.
→ 객체를 저장하려면 어디가 비어있는지 확인
//길이가 10인 배열 생성
Product[] array = new Product[10];
//객체 추가
array[0] = new Product("Model1");
array[1] = new Product("Model2");
//객체 검색
Product model1 = array[0];
Product model2 = array[1];
//객체 삭제
array[0] = null;
array[1] = null;
컬렉션 프레임워크 (Collection Framework)
- 객체들을 효율적으로 추가,삭제,검색할 수 있도록 제공하는 컬렉션 라이브러리
- java.util패키지에 포함
- 인터페이스를 통해서 정형화된 방법으로 다양한 컬렉션 클래스 이용
import 시켜놓고 map set 사용한다.
컬렉션 프레임워크의 주요 인터페이스
List - ArrayList *중복저장 가능 순서를 유지하고 저장 배열과 유사하게 인덱스로 관리
Set - HashSet , TreeSet *중복저장 안됨 순서를 유지하지 않고 저장 집합과 유사
Map - HashMap, TreeMap *키는 중복저장 안됨 키와 값의 쌍으로 관리
List 컬렉션
특징 : 인덱스로 관리 / 중복해서 객체 저장 가능
구현클래스 : ArrayList / Vector / LinkedList
ArrayList
배열을 좀 더 쉽게 쓰려고 만든 것.
ArrayList <> list = new ArrayList <> ();
List 장점 : 객체 제거
빈번한 객체 삽입이 일어나는 곳에서는 ArrayList를 사용하는 것이 바람직하지않는다.
Vector
LinkedList
next : 다음위치 (주소)
LinkedList : 인접 참조를 링크해서 체인처럼 관리
빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다 좋은 성능
배열은 컴퓨터가 보기에 연결, LinkedList는 사람이 보기에 연결되어있다.
Set 컬렉션
HashSet
중복확인하는 절차가 없이 단번에 알아차려서 못오게 할 수 있다.
예를들어 arraylist에 중복허용을 하지 않는다 치면, 하나를 집어넣어도 배열 전체를 다 검사를해야한다.
HashSet은 중복된 것을 읽는 속도가 매우 빠르다. - 메모리를 사용해서
Map 컬렉션
키를 호출하면 값이 나온다.
Map<String, Integer> map = ~;
map.put("홍길동", 30); //객체추가
int score = map.get("홍길동"); //객체찾기
map.remove("홍길동"); //객체삭제
Set<K>KeySet() - 모든키를 Set객체에 담아서 리턴
객체 추가에 add가 아닌 put을 사용한다!
put, get이 가장 많이 사용된다.
HashMap
Map <k, V> map = new HashMap <K, V>();
key → 키의 hashcode → value
*바로 찾기 가능 (검색이 필요없다. 예를들어 arraylist는 배열전체를 다 돌아야지만 hashcode를 통해 바로 찾기가 좋다)
package map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("신용권", 85);
map.put("홍길동", 90);
map.put("동장군", 80);
map.put("홍길동", 95);
System.out.println("총 Entry 수:" +map.size());
//키가 같으면 중복저장이 되지않는다
System.out.println("홍길동:"+map.get("홍길동"));
System.out.println();
//전체 값 확인하기1
//keySet은 map컬렉션에서 key의 값만 모아서 set컬랙션으로만든것
Set<String> keySet = map.keySet();
Iterator<String> keyIterator = keySet.iterator();
while(keyIterator.hasNext()){
String key = keyIterator.next();
Integer value = map.get(key);
System.out.println("\t"+key+":"+value);
}
//key입력하여 해당 key와 value 삭제하기
System.out.println();
map.remove("홍길동");
System.out.println("총 Entry 수:" +map.size());
//전체 값 확인하기2
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();
while(entryIterator.hasNext()){
Map.Entry<String, Integer> entry = entryIterator.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("\t" +key+ ":" +value);
}
//전체삭제
map.clear();
System.out.println("총 Entry 수:" +map.size());
}
}
TreeMap, TreeSet
TreeMap
정렬하는데 쓸 수있다.
왼쪽자식 : 부모보다 적은 값
오른쪽자식 : 부모보다 큰 값
TreeSet
트리셋은 집합을 이진트리로 구성한것
Comparable 과 Comparator
TreeSet과 TreeMap의 자동정렬
·TreeSet의 객체와 TreeMap의 키는 저장과 동시에 자동 오름차순정렬
·숫자(Integer, double) 타입일 경우에는 값으로 정렬
·문자열 타입일 경우에는 유니코드로 정렬
·TreeSet과 TreeMap은 정렬을 위해 java.lang.Comparable을 구현객체를 요구
-Integer, Double, String은 모두 Comparable 인터페이스 구현
-Comparable을 구현하고 있지 않을 경우에는 저장하는 순간 ClassCastException발생
LIFO와 FIFO컬렉션
LIFO : 후입선출 (나중에 넣은 객체가 먼저 빠져나가는 자료구조)
FIFO : 선입선출 (먼저넣은 객체가 먼저 빠져나가는 구조)
Stack클래스
Queue인터페이스
이미지 출처 : 이것이자바다
'STUDY > JAVA' 카테고리의 다른 글
[JAVA-이것이자바다.5장] 참조 타입 확인 문제 (0) | 2022.07.13 |
---|---|
[JAVA] 22-07-08 인터페이스를 이용한 주행 모드 바꾸기 문제 ☑ (0) | 2022.07.10 |
[JAVA] 22-07-07 인터페이스를 활용한 간식 먹기 문제 ☑ (0) | 2022.07.07 |
[JAVA-이것이자바다.4장] 조건문과 반복문 확인 문제 (0) | 2022.07.06 |
[JAVA] 22-07-06 인터페이스를 활용한 차 만들기 예제 ☑ (0) | 2022.07.06 |