HashSet
Set 인터페이스를 상속받은 구현클래스
Set의 성질을 상속받았기 때문에 객체들의 중복을 허용하지 않고 순서를 가지지 않는다. 즉 인덱스가 없다.
(순서를 가지고 싶다면 LinkedHashSet을 구현해야한다)
여기서 HashSet이 판단하는 동일 객체란 꼭 같은 인스턴스를 뜻하진 않는다.
HashSet은 객체를 저장하기 전에 객체의 hashCode( )메소드를 호출해서 해시코드를 얻어낸 후,
이미 저장된 객체의 해시코드와 비교한다.
만약 동일한 해시코드가 나왔을 경우 equals( ) 메소드로 두 객체를 비교해서
true가 나온다면 동일한 객체로 판단하고 중복 저장을 하지 않는다.
위와같은 순서로 동일 객체인지 확인하기 때문에
서로 다른 String 객체인 경우에도 같은 문자열을 갖고 있을 때 중복으로 취급될 수 있다.
문자열을 HashSet에 저장하는 경우,
같은 문자열을 갖는 String 객체는 동등한 객체로 간주되고
다른 문자열을 갖는 String 객체는 다른 객체로 간주되는데,
그 이유는 String 클래스가 hashCode( )와 equals( )메소드를 재정의해서
같은 문자열의 경우 hashCode( )의 리턴값을 같게, equals( )의 리턴값을 참으로 나오게 하기 때문이다.
String 객체 뿐만 아니라 임의의 객체들도 hashCode( )메소드와 equals( )메소드를 재정의하면
서로 다른 객체들이라도 중복으로 취급되게 만들 수 있다.
자주 사용하는 메소드
- add(Object o) : 지정된 요소가 집합에 포함되어 있지 않다면 추가한다.
- clear( ) : 집합의 모든 요소들을 제거한다.
- contains(Object o) : 집합이 지정된 요소를 포함하고 있다면 true를 반환한다.
- equals(Object o) : 지정된 객체가 리스트와 동일한지 비교한다.
- isEmpty( ) : 집합이 요소를 하나도 포함하고 있지 않다면 true를 반환한다.
- remove(Object o) : 집합에서 지정된 요소를 제거한다.
- size( ) : 집합의 크기를 반환한다.
- toArray( ) : 집합에 포함된 모든 요소를 배열로 반환한다.
Set에서 Iterator(반복자) 사용하기
Set 객체는 .get() 메서드가 제공되지 않으므로 다음과 같이 iterator를 활용하여 객체를 순회함
Iterator<Integer> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
예제 1.
<HashSet의 동일 객체 취급 기준 확인하기>
class Member{
public String name;
public int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
return name.hashCode() + age;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Member){
Member member = (Member) obj;
return member.name.equals(name) && member.age == age;
}else {
return false;
}
}
}
public class Set {
public static void main(String[] args) {
Set<Member> set = new HashSet<Member>();
//Member m1 = new Member("홍길동", 150);
//Member m2 = new Member("홍길동", 150);
set.add(new Member("홍길동", 150));
set.add(new Member("홍길동", 150));
System.out.println(set.size()); //1
System.out.println(set); //[collection.Member@33a4444]
}
}
- HashCode( ) 메소드와 equals( ) 메소드를 재정의하면
같은 객체로 취급되어 중복으로 추가되지 않는 다는 것을 알 수 있다.
'JAVA' 카테고리의 다른 글
스택 (Stack)과 큐(Queue) (0) | 2021.07.26 |
---|---|
맵 (Map) (0) | 2021.07.26 |
LinkedList (0) | 2021.07.22 |
ArrayList (0) | 2021.07.22 |
컬렉션 (Collection) (0) | 2021.07.20 |