ㆍSet
- Collection 인터페이스를 확장하는 Set은 어떤 값이 존재하는지, 아닌지 여부를 따질때 유용하다.
- Set의 자료구조는 기본적으로 순서를 따지지 않으며 중복을 허용하지 않는다.
- HashSet : 순서가 필요없는 데이터를 해시 테이블에 저장한다. 별도의 정렬 작업이 없으며, Set 인터페이스를 구현한 클래스 중 가장 성능이 좋다.
- TreeSet: 저장한 데이터의 값에 따라 정렬된다. red-black이라는 트리 타입으로 값이 저장되며, HashSet보다 약간 느리다.
- LinkedHashSet: 연결된 목록 타입으로 구현된 해시 테이블에 데이터를 저장한다. 저장된 순서에 따라 값이 정렬된다. HashSet, TreeSet 보다 더 느리다.
ㆍHashSet
- Object -> AbstractCollection<E> -> AbstractSet<E> -> HashSet<E> ▶ HashSet의 상속관계
■ Set은 데이터가 중복되는 것을 허락하지 않는다. 따라서 equals(), hashCode() 메소드를 구현하는 것이 매우 중요하다.
- Serializable, Cloneable, Iterable<E>, Collection<E>, Set<E> ▶ HashSet이 구현한 인터페이스
HashSet 생성자
- HashSet() : 16개의 공간과 0.75의 로드 팩터를 갖는 객체를 생성한다.
- HashSet(Collection<? extends E> c) : 매개변수로 받은 데이터를 HashSet에 담는다.
- HashSet(int initialCapacity) : 매개변수로 받은 정수 값만큼의 공간과 0.75의 로드 팩터를 갖는 객체를 생성.
- HashSet(int initialCapacity, float loadFactor) : 첫 번째 매개변수로 받은 정수 값만큼의 공간과 두 번째 매개변수의 값만큼 로드 팩터를 갖는 객체를 생성.
- 로드 팩터 : (데이터의 개수) / (저장 공간)
=> 데이터의 개수가 증가하여, 로드 팩터보다 커지면, 저장 공간의 크기는 증가되고 해시 재정리 작업을 수행한다. 이는 내부에 갖고 있는 자료 구조를 다시 생성하는 작업을 거치므로 성능에 영향이 발생한다. 따라서, 가장 적당한 크기를 찾아야한다.
HashSet 주요 메소드
- add(E e) : 데이터를 추가한다. [return boolean]
- clear() : 모든 데이터 삭제
- clone() : HashSet 객체를 복제, 담겨있는 데이터는 복제하지 않음. [return Object]
- contains(Object o) : 지정한 객체가 존재하는지 확인 [return boolean]
- isEmpty() : 데이터가 없는 HashSet인지 확인 [return boolean]
- iterator() : Iterator 객체를 반환 [return Iterator<E>]
- remove(Object o) : 매개변수에 해당하는 객체를 삭제한다. [return boolean]
- size() : 데이터의 개수를 리턴 (HashSet의 공간이 아닌, 저장된 데이터 개수) [return int]
- Collection 자료구조를 사용하기 위해 import java.util.* 필요
- 데이터 출력을 위해 Iterator 객체를 사용할 수 있다. (import java.util.Iterator)
HashSet<String> hash = new HashSet<>();
hash.add("A");
hash.add("B");
Iterator<String> iter = hash.iterator();
while(iter.hasNext()){ //hasNext() 메소드로 다음 값이 있는지 확인
System.out.println(iter.next()); // iterator 객체의 다음 데이터를 얻어냄
}
ㆍLinkedList
- 배열, ArrayList, Vector와 같은 자료 구조에서는 데이터가 삭제될 때, 뒤에 위치한 값들을 전부 위치를 변경해주어야 함.
- LinkedList는 데이터 삭제시, 앞에 있는 데이터와 뒤에 있는 데이터를 연결시켜주기만 하면 된다. 따라서, 메모리 공간 측면에서 유리하다.
- LinkedList는 데이터끼리 앞 뒤로 연결되어있는 형태이다.
- List, Queue (FIFO 구조), Deque (Double Ended Queue) 인터페이스를 구현하고 있다.
- Object -> AbstractCollection<E> -> AbstractList<E> -> AbstractSequentialList<E> -> LinkedList<E>
▶ LinkedList의 상속관계
- Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, Queue<E>, Dequeue<E>
▶ LinkedList가 구현한 인터페이스
LinkedList 생성자
- LinkedList() : 비어있는 LinkedList 객체를 생성
- LinkedList(Collection<? extends E> c) : 컬렉션 객체의 데이터를 LinkedList에 담는다.
- LinkedList는 객체를 생성할 때, 처음부터 크기를 정하지 않는다.
LinkedList 데이터 추가
- addFirst (Object) : LinkedList 객체 가장 앞에 데이터를 추가한다.
- addLast (Object) : LinkedList 객체 가장 뒤에 데이터를 추가한다.
- add (int, Object) : LinkedList 객체의 특정 위치에 데이터를 추가한다.
- set (int, Object) : LinkedList 객체의 특정 위치에 데이터를 변경하고 기존 데이터를 리턴한다. [return Object]
- addAll (Collection) : 매개변수로 받은 컬렉션 데이터를 추가한다.
- addAll (int, Collection) : 매개변수로 받은 컬렉션 데이터를 특정 위치에 추가한다.
LinkedList 데이터 가져오기
- getFirst () : LinkedList 객체 가장 앞의 데이터를 리턴한다.
- peek () : LinkedList 객체 가장 앞의 데이터를 리턴한다.
- getLast () : LinkedList 객체 가장 뒤의 데이터를 리턴한다.
- get (int) : LinkedList 객체의 특정 위치에 데이터를 리턴한다.
LinkedList 특정 데이터가 있는지 확인
- contains (Object) : 매개변수로 넘긴 데이터가 있을 경우 true를 리턴.
- indexOf (Object) : 매개변수로 넘긴 데이터를 앞에서부터 검색하여 index를 리턴. 없을 경우 -1 리턴.
- lastIndexOf (Object) : 매개변수로 넘긴 데이터를 뒤에서부터 검색하여 index를 리턴. 없을 경우 -1 리턴.
LinkedList 데이터 삭제
- remove () : LinkedList 객체의 가장 앞에 있는 데이터를 삭제하고 리턴한다. [return Object]
- removeFirst () : LinkedList 객체의 가장 앞에 있는 데이터를 삭제하고 리턴한다. [return Object]
- pop () : LinkedList 객체의 가장 앞에 있는 데이터를 삭제하고 리턴한다. [return Object]
- removeLast () : LinkedList 객체의 가장 뒤에 있는 데이터를 삭제하고 리턴한다. [return Object]
- remove (int) : 매개변수로 받은 정수 값의 위치에 있는 데이터를 삭제하고 리턴한다. [return Object]
- remove (Object) : 매개변수로 넘겨받은 객체와 동일한 데이터 중 앞에서부터 처음 발견된 데이터를 삭제한다.
- removeLastOccurrence (Object) : 매개변수로 넘겨받은 객체와 동일한 데이터 중 뒤에서부터 처음 발견된 데이터를 삭제한다.
- size() : 데이터의 개수 리턴
- clear() : 모든 데이터 삭제
- clone() : 객체를 복제하여 리턴
- toArray() : 배열로 만들어 리턴
LinkedList 데이터 조회 객체 Iterator
- listIterator (int) : 매개 변수에 지정된 위치부터의 데이터를 검색하기 위한 ListIterator 객체를 리턴.[return ListIterator]
- descendingIterator () : LinkedList 객체의 데이터를 끝에서부터 검색하기 위한 Iterator 객체를 리턴. [return Iterator]
- iterator () : Iterator 객체를 리턴한다. [return Iterator]
public void checkLinkedList2(LinkedList<String> list) {
Iterator<String> iter = list.descendingIterator();
while(iter.hasNext()) {
System.out.print(iter.next() +" ");
// LinkedList 객체의 가장 뒤에 위치한 데이터부터 차례대로 출력.
}
}
- ListIterator 객체는 기존 Iterator 객체의 hasNext(), next() 메소드 외에도 hasPrevious(), previous() 메소드를 통해 이전 데이터도 검색할 수 있다.
참고
ㆍ"자바의 신 vol.2", 이상민 저자
https://docs.oracle.com/javase/8/docs/api/
Java Platform SE 8
docs.oracle.com