[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());
}
}
'Programming > java' 카테고리의 다른 글
[Java] 자바 제네릭 (Generic) 문법 (0) | 2017.05.17 |
---|---|
[Java] 컬렉션 - [Map] HashMap(java.util.HashMap) (2) | 2017.05.16 |
[Java] 캡슐화(encapsulation), 접근 제어자(private, default, protected, public) (0) | 2017.05.15 |
[Java] super 키워드의 사용 (0) | 2017.05.15 |
[Java] 상속과 super() 메서드 (0) | 2017.05.15 |