이 글은 이것이 자바다를 참고하여 작성되었습니다.
- Set 컬렉션은 저장 위치가 유지되지 않는다.
- 인덱스로 관리하지 않는다.
- 객체를 중복해서 저장할 수 없고 하나의 null만 저장할 수 있다.
- add() 메소드 : 객체 추가
- remove() 메소드 : 객체 삭제
- 인덱스로 객체를 검색해서 가져오는 메소드가 없기 때문에 반복자(Iterator)를 제공한다. 반복자는 Iterator 인터페이스를 구현한 객체를 말한다. iterator() 메소드를 호출하면 얻을 수 있다.
Set<String> set = ...; Iterator<String> iterator = set.iterator();
Iterator 인터페이스에 선언된 메소드
- next() 메소드 : 하나의 객체를 가져올 때
- hasNext() 메소드 : 가져올 객체가 있으면 true를 리턴하고 더 이상 가져올 객체가 없으면 false를 리턴한다. 따라서 true가 리턴될 때 next() 메소드를 사용해야 한다.
- remove() 메소드 : next() 메소드로 가져온 객체를 제거
Iterator의 메소드지만 실제 Set컬렉션에서 객체가 제거됨Set<String> set = ...; Iterator<String> iterator = set.iterator(); while(iterator.hasNext()){ // String 객체 하나를 가져옴 String str = iterator.next(); if(str.equals("홍길동")){ iterator.remove(); } }Iterator를 사용하지 않더라도 향상된 for문을 이용해서 전체 객체를 대상으로 반복할 수 있다.
- Set 인터페이스의 구현 클래스
- HashSet 생성 : 기본 생성자를 호출
Set<E> set = new HashSet<E>();- 객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않는다.
HashSet이 판단하는 동일한 객체
: 꼭 같은 인스턴스를 뜻하지는 않는다.
- HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출해서 해시코드를 얻어낸다. 그리고 이미 저장되어 있는 객체들의 해시코드와 비교한다. 만약 동일한 해시코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.
hashCode란..?
: 해시 알고리즘에 의해 생성된 정수 값
- 해시코드 규약
- equals 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메소드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 한다.(단, 애플리케이션을 다시 실행한다면 이 값이 달라져도 상관없다.)
- equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다.
- equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 서로 다른 값을 반환할 필요는 없다. 단, 다른 객체에 대해서는 다른 값을 반환해야 해시테이블의 성능이 좋아진다.
- Object 클래스에 의해 정의된 hashCode() 방법은 별개의 개체에 대해 고유한 정수를 반환합니다. (이것은 일반적으로 객체의 내부 주소를 정수로 변환하여 구현됩니다.)
- 출처 : https://devlog-wjdrbs96.tistory.com/243
hashCode()와 equals() 메소드 재정의
import java.util.Objects; public class Member { public String name; public int age; public Member(String name, int age) { this.name = name; this.age = age; } @Override public int hashCode() { // 두 객체가 같은 객체인지 확인하는 method // name과 age 값이 같으면 동일한 hashCode가 리턴 return name.hashCode() + age; // String의 hashCode() 이용 } @Override public boolean equals(Object obj) { // 두 객체의 내용이 같은지 확인하는 method // name과 age 값이 같으면 true를 리턴 if (obj instanceof Member) { Member member = (Member) obj; return member.name.equals(name) && (member.age == age); } else { return false; } }}