[Java] 컬렉션
Java의 자료구조인 컬렉션의 종류와 사용법 및 간단한 특징들을 정리해보았다.
컬렉션 (List, Set, Queue, Map) 종류와 특징
- 컬렉션은 참조형 변수이다 !
Collection에는 기본형 변수가 아닌 참조형 변수를 저장한다!
- int의 참조형 변수 = Integer
- long의 참조형 변수 = Long
- double의 참조형 변수 = Double
- String은 원래부터 참조형 변수
1. List : 순서가 있는 데이터의 집합(중복가능) = 배열과 비슷
2. Set : 순서가 없는 데이터의 집합(데이터 중복 안됨) = 순서없고 중복없는 배열
3. Queue : FIFO (먼저 넣은 값이 먼저 나옴)
4. Stack : FILO (먼저 넣은 값이 나중에 나옴)
5. Map : 순서가 없는(key,value)쌍으로 이루어진 데이터 집합 (Key 값 중복 안 됨)
자바 컬렉션 구조
- Collection이라는 속성은 Iterable(순회 가능)이라는 속성을 상속받고 있다.
- Collection의 하위 ‘속성’으로는 List, Queue, Set 등이 있다.
- List의 실제 구현체들은 Arr, Linked, Vector, Stack들이 있다.
이러한 컬렉션들이 자바에서 어떻게 사용되는지 코드를 통해 알아보자.
List (ArrayList) 동적배열
import java.util.ArrayList;
ArrayList<Integer> intList = new ArrayList<Integer>(); //선언 + 생성
//add
intList.add(11); //추가
intList.add(33);
intlist.add(22);
//get
intList.get(0); //가져오기 //11
//set
intList.set(1,10); //1번째에 있는 값(33)을 10으로 바꿈
//remove
intList.remove(0); //0번째에 있는 값(11)을 삭제
//clear
intList.clear(); //list에 있는 값 모두 삭제
//toString
intList.toString() //list 값 전체 출력
앞 인덱스의 값을 remove를 통해 삭제하면 남은 값들의 인덱스가 자동으로 한칸씩 당겨진다.
linked list
- 메모리에 남는 공간을 요청해서 여기저기 나누어서 실제 값을 담아둔다.
- 실제값이 있는 주소값으로 목록을 구성하고 저장하는 자료구조
- 기본적 기능은 ArrayList와 동일
- 조회 속도 느리지만, 추가 삭제 속도는 빠르다.
import java.util.LinkedList;
LinkedList<Integer> linkedList = new LinkedList<Integer>();
//추가
linkedList.add(5);
linkedList.add(10);
linkedList.add(3);
//삭제
linkedList.remove(1);
//특정 값 읽기
linkedList.get(0);
linkedList.get(1);
linkedList.get(2);
//전체 값 읽기
linkedList.toString();
//특정 위치에 값 추가
linkedList.add(2,4); //2번째 위치에 4를 추가
//특정 위치 값 업데이트
linkedList.set(1,30); //1번째 위치값을 30으로 업데이트
//전체 비우기
linkedList.clear();
Stack
- FILO
- 최근 저장된 데이터를 나열하고 싶거나, 데이터 중복 처리 막고 싶을 때 사용하면 된다.
import java.util.Stack;
Stack<Integer> intStack = new Stack<Integer>(); //선언 + 생성
//push, pop, peek
//값 추가
intStack.push(10);
//다 지워질 때까지 출력
while(!intStack.isEmpty()) {
System.out.println(intStack.pop());
//맨 위에 있는 값 보기
intStack.peek();
//size확인
intStack.size();
}
Queue
- FIFO
- Queue는 생성자가 없는 인터페이스이기때문에 LinkedList로 생성하였다.
import java.util.Queue;
import java.util.LinkedList;
Queue<Integer> intQueue = new LinkedList<>(); //큐 선언, 생성
//add,poll,peek
//add
intQueue.add(1);
intQueue.add(5);
intQueue.add(9);
//offer : add와 같은 역할
intQueue.offer(1);
//peak (just 보기)
intQueue.peek(); //맨 먼저 넣은 값 보기
//size
intQueue.size();
//값 빼서 확인
intQueue.poll();
offer는 큐에 값 추가를 성공하면 true를 반환하고, 큐가 가득 차서 더 이상 요소를 추가할 수 없는 경우에는 false를 반환한다.
offer와 add의 차이점
- add 함수는 큐에 요소 추가가 실패하면 IllegalStateException 예외를 발생시킨다.
- offer 함수는 큐에 요소 추가가 실패하면 예외를 발생시키지 않고, false를 반환하여 실패를 처리할 수 있다.
Set
- 그냥 쓸 수도 있지만, HashSet, TreeSet 등으로 응용해서 같이 사용 가능하다.
- Set은 생성자가 없는 껍데기라서 바로 생성할 수 없다.
- HashSet은 생성자 존재하기에 HashSet으로 set을 구현하였다.
import java.util.Set;
import java.util.HashSet;
Set<Integer> intSet = new HashSet<>(); //선언 및 생성
//값 추가
intSet.add(1);
intSet.add(12);
intSet.add(5);
intSet.add(1);
//향상된 for문으로 값 출력하는 방법
for(Integer val : intSet) {
System.out.println(val); //중복된 1은 하나만 나옴. 1 12 5
}
//iterator 사용하여 값을 출력하는 방법
Iterator iterator = intSet.iterator();
for (int i = 0; i < intSet.size(); i++) {
System.out.println(iterator.next());
}
//contains (포함하고있는지 알려주는 함수)
intSet.contains(2); //false
Set 컬렉션들 특징
1. HashSet : 가장 빠르며 순서를 전혀 예측할 수 없음
2. TreeSet : 정렬된 순서대로 보관하며 정렬 방법을 지정할 수 있음
3. LinkedHashSet : 추가된 순서, 또는 가장 최근에 접근한 순서대로 접근 가능
즉, 보통 HashSet 을 쓰는데 순서 보장이 필요하면 LinkedHashSet 을 주로 사용한다.
Map
- key - value pair형태의 자료구조
- Map → HashMap, TreeMap으로 응용가능하다.
import java.util.Map;
import java.util.HashMap;
//선언과 생성
Map<String, Integer> intMap = new HashMap<>();
//키 값
intMap.put("일",12);
intMap.put("이",15);
intMap.put("삼",1);
intMap.put("삼",11); //중복 Key
intMap.put("삼",21); //중복 Key
//중복되는 값은 마지막에 입력된 값으로 덮어쓰기 됨. 삼 = 21
//key만 빼서 배열로 만든 것
intMap.keySet()
//key값 전체 출력
for(String key : intMap.keySet()) {
System.out.println(key);
}
//value값만 빼서 배열로 만든것
intMap.values()
//value값 전체 출력
for(Integer value: intMap.values()) {
System.out.println(value);
}
//Key값으로 value값 가져오기
intMap.get("삼");
Map 컬렉션들 특징
1. HashMap : 중복을 허용하지 않고 순서를 보장하지 않음, 키와 값으로 null이 허용
2. TreeMap : key 값을 기준으로 정렬을 할 수 있다. 다만, 저장 시 정렬(오름차순)을 하기 때문에 저장시간이 다소 오래 걸린다.