본문 바로가기

프로그래밍/Java

Hashset에 대해

참고 : https://www.youtube.com/watch?v=NEkxSTicSx8(남궁성 유튜브)


HashSet과 TreeSet

- TreeSet과 HashSet은 내부적으로 TreeMap을 이용하여 구현되어 있다.

- 순서가 없으며 중복이 없다.

- Set의 종류에는 루트에 Set이 있으며 두 갈래로 나뉘여 HashSet과 SortedSet이 있고, 각각 자식으로 LinkedHashSet과 TreeSet이 있다.


HashSet

- Set인터페이스를 구현한 대표적인 컬렉션 클래스

- Hashing기법을 사용한다.

- 순서를 유지하려면 LinkedHashSet클래스를 사용하면 된다.


TreeSet

- 범위 검색과 정렬에 유리한 컬렉션 클래스

- HashSet보다 데이터 추가와 삭제에 시간이 더 걸린다.


HashSet

- boolean add(Object o)

- 저장할 객체의 equals()와 hashCode()를 호출하기 때문에 두 메소드가 오버라이딩되어 있어야 한다.

*(Objectsvalues).hashCode()를 JDK1.8버전 이후부터는 Objects.hash(Objectsvalue)로 나타낼 수 있게 되었다.

- HashSet은 객체를저장하기 전에 기존에 같은 객체가 있는지 확인하고 없으면 저장(true)하며 있으면 저장하지 않는다.(false)

ex)

Object[] objArr = {"1", new Integer(1), "2", "2", "4", "3", "3", "4", "3"};

//ctrl+swift+o를 하면 오토 임포트를 할 수 있다.

Set set = new HashSet();

for (int i = 0; i < objArr.length; i++)

set.add(objArr[i]);

System.out.println(set);

=> [1, 1, 2, 3, 4] //여기서 1이 두개로 보이지만 객체형과 String형의 다른 타입이라 중복이 아니다.


-hashCode()의 오버라이딩 조건(JDK1.8부터는 Objects.hash()도 같은 효과를 줄 수 있다.)

- 동일 객체에 대해 hachCode()를 여러 번 호출해도 같은 값을 반환해야 한다.

- equals()로 비교해 true를 얻은 두 객체의 hashCode()값은 반드시 일치해야 한다.

- equals()로 비교한 결과가 false인 두 객체의 hashCode()값이 같을 수 있다. 하지만 성능 향상을 위해서 간으하면 서로 다른 값을 반환하도록 작헝하는 것이 좋다.


TreeSet

- 범위 검색정렬에 유리한 이진 탐색 트리(Binary Search Tree)로 구현되어 있다.

- 링크드 리스트처럼 각 요소(node)가 나무 형태로 연결된 구조이다.

- 이진 트리는 모든 노드가 최대 두 개의 하위 노드를 갖는다(부모-자식관계)

- 이진 검색 트리는 부모보다 작은 값을 왼쪽에, 큰 값은 오른쪽에 저장한다.

- 루트부터 시작하여 각 노드를 비교해가며 저장할 장소를 찾기 때문에 HashSet보다 데이터를 추가, 삭제하는 데 시간이 더 걸린다.(반복적인 비교 후 저장) 


TreeSet 데이터 저장과정

- boolean add(Object o)

- 만약 TreeSet에 7, 4, 9, 1, 5순서로 저장한다면 아래의 과정을 거치게 된다(루트부터 트리를 따라 내려가며 값을 비교하고, 작으면 왼쪽, 크면 오른쪽에 저장되게 된다.


TreeSet에서 자주 쓰이는 주요 생성자와 메소드

- TreeSet() : 기본 생성자

- TreeSet(Collection c) : 주어진 컬렉션을 저장하는 TreeSet을 생성

- TreeSet(Comparator comp) : 주어진 정렬기준으로 정렬하는 TreeSet을 생성

- Object first() : 정렬된 순서에서 첫 번째 객체를 반환한다

- Object last() : 정렬된 순서에서 마지막 객체를 반환한다.

- Object ceiling(Object o) : 지정된 객체와 같은 객체를 반환, 없으면 큰 값을 가진 객체 중 제일 가까운 값의 객체를 반환, 없으면 null을 반환한다.

- Object floor(Object o) : 지정된 객체와 같은 객체를 반환, 없으면 작은 값을 가진 객체 중 제일 가까운 값의 객체를 반환, 없으면 null.

- Object heigher(Object o) : 지정된 객체보다 큰 값을 가진 객체 중 제일 가까운 값의 객체를 반환, 없으면 null.

- Object lower(Object o) : 지정된 객체보다 작은 값을 가진 객체 중 제일 가까운 값의 객체를 반환, 없으면 null.

- SortedSet subSet(Object fromElement, Object toElement) : 범위 검색(fromElement와 toElement사이)의 결과를 반환한다.(끝 범위인 toElement는 범위에 포함되지 않는다.)

- SortedSet headSet(Object toElement) : 지정된 객체보다 작은 값의 객체들을 반환한다.

- SortedSet tailSet(Object fromElement) : 지정된 객체보다 큰 값의 객체들을 반환한다.


전위, 중위, 후위 순회

- 이진 트리의 모든 노드를 한 번씩 읽는 것을 트리 순회라고 한다.

- 전위, 중위, 후위 순회법이 있으며, 중위 순회하게 될 경우 오름차순으로 정렬되게 된다.

- 부모 노드가 위치하는 곳을 기준으로 생각하면 세 가지 순회법에 대해 쉽게 이해 가능하다.


ex) 10, 35, 45가 있을 때(35가 부모 노드)

전위 -> 35, 10, 45(부모 노드가 왼쪽 노드보다 앞에간다고 생각하자)

중위 -> 10, 35, 45(부모 노드가 자식 노드들 사이에 간다)

후위 -> 10, 45, 35(부모 노드가 오른쪽 노드보다 뒤에 간다)

'프로그래밍 > Java' 카테고리의 다른 글

Iterator와 Enumeration, ListIterator에 대해  (0) 2019.04.25
Stack과 Queue에 대해  (0) 2019.04.22
Collection framework에 대해 (3)  (0) 2019.04.21
Collection framework에 대해(2)  (0) 2019.04.20
Collections framework에 대해 (1)  (0) 2019.04.19