Set 이란 ?
자바 컬렉션에서 HashSet은 Set 인터페이스의 구현 클래스다. Set은 저장 순서를 유지하지 않는다. 또한 중복값 또한 허용하지 않는다.
(만약 순서를 유지하고 싶다면 LinkedHashSet 클래스를 사용해야한다.)
Set<String> set = new HashSet<String>();
set.add("홍찬기");
set.add("가나다");
set.remove("홍찬기");
Iterator<String> ir = set.iterator();
while( ir.hasNext() ){
System.out.print(ir.next() + " ") ;
}
System.out.println();
System.out.println(set.toString() );
System.out.println(set.contains("홍찬기");
set.clear();
System.out.println(set.isEmpty() );
System.out.println(set.size() );
set 관련 문제를 풀다가 hashCode() 와 Equals() 에 대해 좀 알아보았다.
hashCode() 란 ?
int hashCode() 로 정의된 hashCode() 메소드는 실행중에 객체에의 유일한 Integer값을 반환한다. Object클래스에서는 heap에 저장된 객체의 메모리 주소를 반환한다. (항상 그런 것은 아니다.)
여기서 궁금한 게 생겼다. hashCode에 대해서 검색해보았더니 알고리즘 문제를 풀 때 항상 써왔던 equals() 함수가 같이 붙어다녔다. 둘 관계는 이렇다.
equals 와 hashCode의 관계
동일한 객체는 동일한 메모리 주소를 갖는다는 것을 의미한다. 그러므로 동일한 객체는 동일한 해시코드를 가져야한다. 그렇기 때문에 equals() 메서드를 오버라이드하면 hashCode() 메서드 또한 오버라이드 해야한다.
- 프로그램을 실행하는 동안 equals에 사용된 데이터가 수정되지 않았다면 hashCode값은 항상 동일한 정수값이 반환되어야한다.
- 두 객체가 equals() 메서드에 의해 동일하다면 hashCode의 정수값도 같아야한다는 것
즉, 만약 obj1.equals(obj2) == true 라면 hashCode(obj1) == hashCode(obj2) 이여야한다. 하지만 hashCode(obj1) == hashCode(obj2) 라고해서 obj1.equals(obj2) == true 일 필요는 없다.
TreeSet 이란 ?
TreeSet은 HashSet과 마찬가지로 Set인터페이스를 구현한 클래스로서 Set의 성질 그대로를 가지고 있다. 하지만 HashSet과 다르게 TreeSet은 이진 탐색 트리 구조로 이우러져 있다. 이진 탐색 트리는 추가와 삭제에는 시간이 더 걸리지만 정렬, 검색에 높은 성능을 보인다. 이때 생성자의 매개변수로 Comparator 객체를 입력하여 정렬 방법을 임의로 지정해줄 수 있다. (중요)
이진 탐색 트리 데이터 저장 구조
TreeSet<Integer> set = new TreeSet<Integer>();
set.add(10);
set.add(2);
set.size();
System.out.println(set);
System.out.println(set.first () );
System.out.println(set.last() );
System.out.println(set.higher(2) );
System.out.println(set.lower(2) );
iterator ir = set.iterator();
while( ir.hasNext() ){
System.out.println(ir.next() );
}