23장 자바랭 다음으로 많이 쓰는 애들은 컬랙션 - Part2(Set, Queue)
- 순서와 상관 없는 여러 데이터를 하나의 객체에 저장할 때 사용하는 Collection의 하위 인터페이스
- set
- HashSet 클래스는 생성자를 통하여 저장 가능한 데이터의 초기 크기를 지정할 수 있는지?
- x
- HashSet 클래스의 객체에 데이터를 추가하는 메소드는 무엇인지?
- add()
- HashSet 클래스의 객체에 어떤 데이터가 존재하는지 확인하는 메소드?
- contains()
- HashSet 클래스의 객체에 어떤 데이터를 삭제하는 메소드는?
- remove()
- Queue는 FIFO를 처리하기 위한 클래스들의 인터페이스다. FIFO의 약자는?
- first in first out
- Deque는 무슨 단어의 약어이며 용도는?
- Double Ended Queue, Queue인터 페이스를 확장하였음. 대신 맨 앞에 값을 넣거나 빼는 작업, 맨 뒤에 값을 넣거나 빼는 작업을 수행하는 용도
- AbstractSetLinkedList 클래스의 특징
- List도 되고, Queue도 되는 두 인터페이스의 기능을 모두 구현한 클래스.
- Deque인터페이스도 구현하여 맨 앞과 끝의 데이터를 쉽게 처리가 가능
Set
- 순서에 상관 없이, 어떤 데이터가 존재하는지를 확인하기 위한 용도로 많이 사용됨. 즉, 중복을 방지하고 원하는 값이 포함되있는지 확인함이 주용도
- HashSet, TreeSet, LinkedHashSet은 Set 인터페이스를 구현함
- HashSet : 순서가 전혀 필요 없는 데이터를 해시 테이블에 저장한다. Set 중 가장 성능이 좋다
- TreeSet : 저장된 데이터의 값에 따라 정렬되는 셋이다. red-black이라는 트리 타입으로 값이 저장되며, HashSet보다 성능이 느리다
- LinkedHashSet : 연결된 목록 타입으로 구현된 해시 테이블에 데이터를 저장한다. 저장된 순서에 따라서 값이 정렬된다. 그러나 성능이 셋 중 가장 나쁨
- 성능 차이가 발생하는 이유는 데이터 정렬 때문
HashSet
java.lang.Object
-java.util.AbstractCollection<E>
-java.util.AbstractSet<E>
-java.util.HashSet<E>
- 중복을 허용하지 않으며 데이터가 같은지를 확인하는 작업은 Set의 핵심
- equals(), hashCode()메소드 구현은 아주 중요
- 순서가 없다. 따라서, 순서가 매개 변수로 넘어가는 메소드나, 수행 결과가 데이터의 위치와 관련된 메소드는 필요가 없음
HashSet 생성자 - 로드팩터
(데이터의 개수)/ (저장 공간)을 의미하며, 만약 데이터의 개수가 증가하여 로드 팩터보다 커지면 저장 공간의 크기는 증가되고 해시 재정리 작업을 해야한다. 해시 재정리 작업에 들어가면 내부에 갖고 있는 자료 구조를 다시 생성하는 단계를 거쳐야 하므로 성능에 영향 발생
로드 팩터라는 값이 클수록 공간은 넉넉해지지만, 데이터를 찾는 시간은 증가하므로, 초기 공간 개수와 로드 팩터는 데이터의 크기를 고려하여 산정하는 것이 좋다.
주요 메소드
- add()
- 데이터 추가
- clear()
- 모든 데이터 삭제
- clone()
- HashSet객체 복제
- contains()
- 지정한 객체가 존재하는지 확인
- isEmpty()
- 데이터가 있는지 확인
- iterator()
- 데이터를 꺼내기 위한 Iterator 객체를 리턴
- remove()
- 매개 변수로 넘어온 객체를 삭제
- size()
- 데이터의 개수 리턴
데이터를 출력하는 방법
- for( 타입이름변수 : 반복대상객체)
- itetor() 메소드 사용
public void printCarSet2(Set<String> carSet){
Iterator<String> iterator = carSet.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next()+ " ");
}
}
Queue
- FIFO (First In First Out)의 용도
- 여러 스레드에서 들어오는 작업을 순차적으로 처리
- LinkedList
LinkedList
- List, Queue, Deque 인터페이스 모두 구현
- List이자, Queue, Deque
- 배열의 중간에 있는 데이터가 지속적으로 삭제되고, 추가될 경우 LinkedList가 배열보다 메모리 공간 측면에서 유리. 왜냐면 배열과 같은 ArrayList나 Vector는 각 위치가 정해져 있고 그 위치로 데이터를 찾는다. 그런데, 맨 앞의 값을 삭제하면 그 뒤에 있는 값들은 하나씩 앞으로 위치를 이동해야 제대로 된 위치의 값을 찾을 수 있다.
- 반면, LinkedList는 중간에 있는 데이터를 삭제하면 위치를 맞추기 위해 값을 이동하는 단계를 거칠 필요가 없다.
Deque
- Double Ended Queue
- 맨 앞의 값을 넣거나 빼는 작업, 맨 뒤에 값을 넣거나 빼는 작업을 수행하는데 용이
LinkedList 주요 메소드
- addFirst(), offerFirst(), push()
- LinkedList 객체의 가장 앞에 데이터를 추가
- add(), addLast(), offer(), offerLast()
- LinkedList 객체의 가장 뒤에 데이터를 추가
- add(int, Object)
- LinkedList 객체의 특정 위치에 데이터 추가
- set(int, Object)
- LinkedList 객체의 특정 위치에 데이터를 수정. 그리고 기존에 있던 데이터를 리턴
- addAll(Collection)
- 매개 변수로 넘긴 컬렉션의 데이터를 추가
- addAll(int, Collection)
- 매개 변수로 넘긴 컬렉션의 데이터를 지정된 위치에 추가
- getFirst(), peekFirst(), peek(), element()
- LinkedList 객체의 맨 앞에 있는 데이터를 리턴
- getLast(), peekLast()
- LinkedList 객체의 맨 뒤에 있는 데이터를 리턴
- get(int)
- LinkedList 객체의 지정한 위치에 있는 데이터를 리턴
- contians()
- 매개 변수로 넘긴 데이터가 있을경우 true 리턴
- indexOf()
- 매개 변수로 넘긴 데이터의 위치를 앞에서부터 검색하며 리턴. 없을 경우 -1 리턴
- lastIndexOf()
- 매개 변수로 넘긴 데이터의 위치를 끝에서부터 검색하여 리턴. 없을 경우 -1 리턴
- remove(), removeFirst(), poll(), pollFirst(), pop()
- LinkedList 객체의 가장 앞에 있는 데이터를 삭제하고 리턴
- pollLast(), removeLast()
- LinkedList 객체의 가장 끝에 있는 데이터를 삭제하고 리턴
- remove(int)
- 매개변수에 지정된 위치에 있는 데이터를 삭제하고 리턴
- remove(Object), removeFirstOccurence(Object)
- 매개변수로 넘겨진 객체와 동일한 데이터 중 앞에서부터 가장 처음에 발견된 데이터 삭제
- removeLastOccurence(Object)
- 매개변수로 넘겨진 객체와 동일한 데이터 중 끝에서부터 가장 처음에 발견된 데이터 삭제
- listIterator
- 매개 변수에 지정된 위치부터의 데이터를 검색하기 위한 ListIterator 객체를 리턴
- descendingIterator
- LinkedList의 데이터를 끝에서부터 검색하기 위한 Iterator 객체를 리턴
- ListIterator는 Iterator인터페이스가 다음 데이터만을 검색할 수 있다는 단점을 보완하여 이전 데이터도 검색이 가능 => previous()
'JAVA > about java' 카테고리의 다른 글
[static] satic 블록, static 변수와 static 메서드 (0) | 2023.05.03 |
---|---|
[Collection] Map (0) | 2023.05.01 |
[Collection] List (0) | 2023.04.30 |
[Generic] 제네릭 (0) | 2023.04.30 |
[GC] Garbage Collector (0) | 2023.04.29 |