Be ready to study forever - 개발자 꿈나무

[JAVA 문법] Collection Framework - Set 본문

Programming/JAVA

[JAVA 문법] Collection Framework - Set

루눌룹 2020. 7. 28. 14:14

Collection Framework – Set

1. HashSet

HashSetSet인터페이스를 구현한 컬렉션이므로 중복이 허용되지 않고 순서 또한 존재하지 않는다. add(Object o)메서드나 addAll(Collection c)메서드는 리턴 값을 boolean으로 하며 중복이 있어 추가되지 않으면 false를 반환한다.

HashSet은 저장 순서가 없으므로 저장되는 순서를 원한다면 LinkedHashSet을 활용하면 된다.

*HashSet은 내부적으로 HashMap을 이용하여 만들어졌다.

1.1. HashSet 메서드

1.2. HashSet의 과 equals( ), hashCode( )

HashSetAdd메서드를 사용하여 인스턴스를 추가할 때 인스턴스의 객체에 equals()hashCode()를 오버라이드하여 목적에 맞게 사용해야 한다.

*예를 들어, String처럼 equals()를 오버라이드해서 주소 값이 달라도 String의 내용이 같다면 equals()true를 반환하는 것처럼. StringHashCode가 오버라이드 되어 주소 값에 대한 해시 값이 아닌 String내용에 대한 해시값을 반환하는 것처럼(String내용이 같다면 hash값도 같다.)

예제코드

hashCode()메서드 오버라이드는

hashCode(){ return Objects.hash(name, age) }로 바꿔서 Objects클래스의 hash메서드 를 사용하는 편이 더 좋다.

hashCode()를 오버라이딩 할 때 만족해야하는 3가지 조건

  1. 동일한 객체에 대해서는 여러 번 hashCode()를 호출해도 항상 동일한 값을 반환해야한다. (hashCode( )를 주소 값이 아닌 내용의 값으로 해시 값을 넣도록 오버라이딩)
  2. equals()를 통해 true값을 받은 두 인스턴스의 hashCode()의 리턴 값은 같아야 한다.
  3. equals()에서 false를 받은 두 인스턴스는 같은 hashCode()의 리턴 값을 받아도 무관하다. 하지만, 성능향상을 위해서 각각 다른 값을 가지는게 좋다.( id혹은 유니크한 값을 넣어서 해시코드를 만들지 안아도 된다.)

2. TreeSet

TreeSet은 이진 검색 트리(binary search tree)라는 자료구조의 형태로 데이터를 저장하는 컬렉션이다. 이진 검색 트리는 정렬, 범위검색에 높은 성능을 보인다. Set인터페이스를 구현한 것이므로 중복은 허용되지 않으며 저장되는 순서 또한 없다. JAVATreeSet은 이진 검색 트리를 향상 시킨 레드- 트리(Red-Black Tree)로 구현되었다.

2.1. TreeSet(이진 검색 트리)의 특징

  • 1. 모든 노드는 최대 두개의 자식노드를 가질 수 있다.
  • 2. 왼쪽 자식노드의 값은 부모노드 보다 작고, 오른쪽 자식노의 값은 부모노드 보다 크다
  • 3. 노드의 추가 삭제에 시간이 걸린다(순차적으로 저장하지 않기 때문)
  • 4. 범위검색과 정렬에 유리하다
  • 5. 중복된 값을 저장하지 못한다

 

2.2. TreeSet의 메서드

2.3. headset( )tailSet( )의 사용법

headSet(Object toElement)은 매개변수로 받은 객체보다 큰값을 반환하고, tailSet(Object FromElement)는 매개변수로 받은 객체보다 작은 값을 반환한다.

예제코드

 

Comments