[Java] 자바 컬렉션 클래스 - [Set] HashSet (java.util.Hashset)


컬렉션 클래스 : HashSet (java.util.HashSet)

 - 저장하려는 객체에 대해 hashCode()를 호출하여

   그 리턴 값을 가지고 저장할 위치를 계산한다.

 - null 값을 저장할 수 있다.

 - 값을 중복 저장할 수 없다.

   이유 -> '집합'이기 때문

 - 값을 넣을 때 인스턴스의 해시값을 기준으로 저장하기 때문에

   순서대로 저장되지 않는다.

   그래서 값을 꺼낼 때도 순서대로 꺼낼 수 없다.

 - 값을 꺼낼 때 숫자 인덱스로 꺼낼 수 없다.

 - 예) HashSet



Set 컬렉션에서 값을 꺼내는 방법


 1) 배열을 리턴 받는다. (입력 순서대로 리턴 받을 수 없다.)

     - toArray()


Object[] valueList = dateSet.toArray();


for (int i = 0; i < valueList.length; i++) {
  System.out.println(valueList[i]);

}


 2) 값을 꺼내주는 메서드를 이용한다.

     - iterator()


Iterator iterator = dateSet.iterator();
 
while (iterator.hasNext()) { // hasNext() -> 꺼낼 데이터가 있는가?
  System.out.println(iterator.next());

}






* 주의!
  HashSet 컬렉션에 값을 저장할 때,
  인스턴스의 주소가 영향을 끼치는 것이 아니라

  hashCode()의 리턴 값이 영향을 끼친다.



HashSet과 hashCode() 메서드 예제


public static void main(String[] args) {
    HashSet set = new HashSet();
    
    set.add(new String("홍길동"));
    set.add(new String("임꺽정"));
    set.add(new String("유관순"));
    set.add(new String("윤봉길"));
    set.add(new String("안중근"));
    set.add(new String("김구"));
    set.add(new String("김구"));
    /* "김구" 문자열인 경우엔 서로 다른 인스턴스 임에도 불구하고 중복되지 않는다.
     *  왜?
     *  => Set은 객체(의 주소)를 저장할 때 그 객체에 대해 hashCode() 메소드를 호출한 후
     *     그 리턴 값을 위치를 계산한다.
     *  => String 클래스는 같은 값을 갖는 경우 같은 hash value를 리턴하도록
     *     hashCode()를 오버라이딩 하였다.
     *     즉 위의 두 개의 "김구" String 객체는 비록 인스턴스는 다르지만
     *     값이 같기 때문에 hashCode()의 리턴값도 같다.
     *     그래서 위치를 계산한 값도 같다.
     *     위치 계산 값이 같아서 같은 값으로 간주하기 때문에 중복 저장되지 않는다.
     */
   
    // 증명! -> 값이 다 똑같이 출력된다.
    System.out.println(new String("김구").hashCode());
    System.out.println(new String("김구").hashCode());
    System.out.println(new String("김구").hashCode());
     
   
    /* 결론!
     * HashSet 컬렉션에 값을 저장할 때,
     * 인스턴스의 주소가 영향을 끼치는 것이 아니라
     * hashCode()의 리턴 값이 영향을 끼친다.
     */
   
    Iterator iterator = set.iterator();
    while (iterator.hasNext()) { // 꺼낼 데이터가 있는가?
      System.out.println(iterator.next());
    }
}


블로그 이미지

필로그래머

,