[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());
    }
}


블로그 이미지

필로그래머

,

[Java] 자바 컬렉션 클래스 - List, Set, Map의 개념 정리


컬렉션 클래스

- 여러 개의 주소를 보관할 때 사용하는 클래스이다.

- 사용 목적 :

  배열의 문제는 인스턴스를 배열 크기 만큼만 저장할 수 있다는 것이다.

  더 추가로 저장하고 싶다면, 새 배열을 만들어야 한다.

  관리하기 너무 번거롭다.


자바에서 제공하는 컬렉션 클래스의 종류

 1) List 계열 

    - null 값을 저장할 수 있다.

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

    - 값을 넣는 순서대로 저장한다.

      그래서 값을 꺼낼 때도 넣은 순서대로 꺼낼 수 있다.

    - 값을 꺼낼 때 숫자 인덱스를 사용하여 꺼낸다.

    - 예) ArrayList, LinkedList


2) set계열

    - HashSet

    - null 값을 저장할 수 있다.

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

       이유 -> 집합이기 때문

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

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

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

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

    - 예) HashSet


3) Map 계열

    - 값을 저장할 때 key 개체의 해시 값(hash value)을 사용하여 저장한다.

    - 값을 꺼낼 때도 key 객체의 해시 값을 사용하여 꺼낸다.

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

    - 순서대로 저장하고 순서대로 꺼낼 수 없다.

    - 보통 문자열 라벨을 사용하여 값을 저장하고 꺼낼 때 주로 사용한다.

    - 예)

       HashMap :

       - key나 value로 null을 허용한다.

       - 동기화를 지원하지 않는다.

          => 여러 스레드가 동시에 접근하여 값을 변경하는 것을 막지 않는다.

          => 데이터의 입출력 속도가 빠르다.

          => 대신 여러 스레드가 동시에 값을 바꿀 수 있기 때문에 

               멀티 스레드 상황에서 사용할 때 주의해야 한다.


       Hashtable : 

       - key나 value로 null을 허용하지 않는다.

       - 동기화를 지원한다.

          => 여러 스레드가 동시에 접근하더라도 그 중 한개의 스레드만이 접근할 수 있다.

          => 데이터의 입출력 속도가 느리다.

          => 대신 여러 스레드가 동시에 값을 바꿀 수 없기 때문에

               멀티 스레드 상황에서 안전하게 사용할 수 있다.



아래 참조


2017/05/17 - [java] - [Java] 컬렉션 클래스 - ArrayList를 직접 만들어서 내부 구조를 이해해보자

2017/05/16 - [java] - [Java] 컬렉션 클래스 - HashSet

2017/05/16 - [java] - [Java] 컬렉션 - [Map] HashMap(java.util.HashMap)




블로그 이미지

필로그래머

,