Set, TreeSet, HashSet

changi123·2023년 9월 16일
0

공부

목록 보기
1/24
post-thumbnail

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() );
    
// Set 데이터 크기
	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() );

// 입력값보다 큰 데이터 중 바로 다음 값
// 만약 입력값보다 큰 값중 최소값이 없다면 null 반환
System.out.println(set.higher(2) ); 

// 입력값보다 작은 데이터 중 바로 전 값
// 만약 입력값보다 작은 값중 최대값이 없다면 null 반환
System.out.println(set.lower(2) ); 

// 반복자 출력
iterator ir = set.iterator();
while( ir.hasNext() ){
	System.out.println(ir.next() );
}
profile
개발자 홍찬기 꾸준한 사람이 되자

0개의 댓글

관련 채용 정보