📔 학습한 내용을 정리하기 위해 작성하는 게시글입니다.
LinkedHashSet
은 Set
을 상속받았으나 저장 순서 유지, 중복 허용 XSet<E>
인터페이스를 구현한 대표적인 클래스로는 HashSet<E>
, TreeSet<E>
, LinkedHashSet<E>
가 있음구분 | 리턴 타입 | 메서드명 | 기능 |
---|---|---|---|
데이터추가 | boolean | add(E element) | 매개변수로 입력된 원소를 리스트에 추가 |
boolean | addAll(Collection<? Extends E> c) | 매개변수로 입력된 컬렉션 전체를 추가 | |
데이터 삭제 | boolean | remove(Object o) | 원소 중 매개변수 입력과 동일한 객체 삭제 |
void | clear() | 전체 원소 삭제 | |
데이터 정보 추출 | boolean | isEmpty() | Set<E> 객체가 비어 있는지 여부를 리턴 |
boolean | contains(Object o) | 매개변수로 입력된 원소가 있는지 여부를 리턴 | |
int | size() | 리스트 객체 내에 포함된 원소의 개수 | |
Iterator<E> | iterator() | Set<E> 객체 내의 데이터를 연속해서 꺼내는 Iterator 객체 리턴 | |
Set<E> 객체 배열 반환 | Object[] | toArray() | 리스트를 Object 배열로 반환 |
T[] | toArray(T[]t) | 입력매개변수로 전달한 타입의 배열로 반환 |
iterator()
는 Set<E>
객체 내부의 데이터를 1개씩 꺼내 처리할 때 사용하는 메서드(인덱스 번호가 없어서 List<E>
객체처럼 for문으로 데이터 출력 불가능함)iterator()
메서드 호출Iterator<E>
객체 생성hasNext()
메서드로 리턴 값이 false일 때, 마지막 데이터까지 읽음(hasNext()
메서드는 다음 원소의 존재 여부를 불리언으로 리턴)next()
메서드로 다음 원소 위치로 가서 값을 리턴Iterator<E>
객체가 생성되면 이 객체가 가리키고 있는 위치는 첫 원소가 아닌 첫 원소 바로 이전의 위칫값 → 즉, 첫 번째 원솟값을 읽기 위해서는 iterator.next()
를 실행 리턴 타입 | 메서드 | 기능 |
---|---|---|
boolean | hasNext() | 다음으로 가리킬 원소의 존재 여부를 불리언으로 리턴 |
E | next() | 다음 원소 위치로 가서 읽은 값을 리턴 |
Set<E> 객체명 = new HashSet<E>();
Set<E>
인터페이스를 구현한 대표적인 구현 클래스LinkedHasSet<E>
클래스를 사용hash algorithm
)을 사용해 중복 데이터인지 검색hashCode()
메서드에서 반환하는 해시 코드값에 해당하는 내부 목록 탐색equals()
메서드를 호출하여 내용이 같은지 비교해시 알고리즘(hash algorithm)이란?
해시 함수(hash function)를 사용하여 데이터를 해시 테이블(hash table)에 저장하고, 다시 그것을 검색하는 알고리즘
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Ex06_Set {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("orange");
set.add("apple");
set.add("banana");
set.add("apple");
System.out.println("객체 수: " + set.size());
//반복자를 이용한 전체 출력
for(Iterator<String> itr = set.iterator(); itr.hasNext();)
System.out.print(itr.next() + '\t');
System.out.println();
//향상된 기능의 for문을 이용한 전체 출력
for(String s : set)
System.out.print(s + '\t');
System.out.println();
}
}
객체 수: 3
orange banana apple
orange banana apple
Set<E> 객체명 = new LinkedHashSet<E>();
HashSet<E>
의 자식 클래스로, HashSet<E>
의 모든 기능에 데이터 간의 연결 정보만을 추가로 갖는 컬렉션(입력 순서 기억)List<E>
처럼 중간에 데이터 추가, 특정 순서에 저장된 값 가져오는 것은 불가능Set<E> 객체명 = new Treeset<E>();
Set<E>
의 기능에 크기에 따른 정렬(오름차순 정렬) 및 검색 기능이 추가된 컬렉션binary search tree
)의 형태로 요소를 저장Navigable Set<E>
와 SortedSet<E>
를 부모 인터페이스로 둠 → TreeSet<E>
생성자로 객체를 생성해도 Set<E>
타입으로 선언하면 정렬 및 검색 기능 사용 할 수 없음이진 탐색 트리(Binary Search Tree, BST)란?
트리 구조로써 부모 노드가 자신보다 작은 값을 가진 자식 노드와 자신보다 큰 값을 가진 자식 노드를 가지는 구조
- 모든 노드는 이진 탐색 트리내에서 유일한 키를 가짐
- 부모가 가지는 자식 노드의 수가 2개 이하
- 각 노드의 왼쪽 자식 노드는 부모 노드 보다 작은 값, 오른쪽 자식 노드는 부모 노드 보다 큰 값을 가져야 함
- 저장되는 자료의 중복 허용 X
- 특정 값 탐색이 빠름
import java.util.Iterator;
import java.util.TreeSet;
public class Ex08_TreeSet {
public static void main(String[] args) {
TreeSet<String> tree = new TreeSet<>();
tree.add("홍길동");
tree.add("전우치");
tree.add("손오공");
tree.add("멀린");
tree.add("손오공");
System.out.println("객체 수: " + tree.size());
//Iterator 반복자에 의한 반복
for(Iterator<String> itr = tree.iterator(); itr.hasNext();)
System.out.print(itr.next().toString() + '\t');
System.out.println();
}
}
객체 수: 4
멀린 손오공 전우치 홍길동
컬렉션 | 데이터 중복 | 저장 순서 유지 | 구현 방식 |
---|---|---|---|
HashSet<E> | X | X | 해싱(hashing) |
LinkedHashSet<E> | X | X (입력된 순서대로 관리) | |
TreeSet<E> | X | O (오름차순 정렬) | 이진 탐색 트리(BST) |
HashSet<E>
에서는 두 객체가 같은지 다른지를 비교, TreeSet<E>
에서는 두 객체의 크기를 비교<이재환의 자바 프로그래밍 입문>
<Do it! 자바 완전 정복>
http://www.tcpschool.com/java/java_collectionFramework_set
https://hseungyeon.tistory.com/366