HashSet은 set interface를 구현한 컬렉션 클래스로서 데이터의 중복 저장을 허용하지 않으며 저장 순서 유지를 하지 않는다는 특징이 있다.
Set 컬렉션 클래스에서 가장 많이 사용되는 클래스 중 하나이다.
HashSet class는 Hash Algorithm을 사용하여 검색 속도가 빠르다.
멤버들의 중복 여부를 체크하기 위해 인스턴스의 동일성을 확인해야한다. 이를 위해 필요에 따라 equals()와 hashCode()메서드를 재정의 해줘야한다.
HashSet<String> hs01 = new HashSet<String>();
HashSet<String> hs02 = new HashSet<String>();
// add() 메소드를 이용한 요소의 저장
hs01.add("홍길동");
hs01.add("이순신");
System.out.println(hs01.add("임꺽정"));
System.out.println(hs01.add("임꺽정")); // 중복된 요소의 저장
// Enhanced for 문과 get() 메소드를 이용한 요소의 출력
for (String e : hs01) {
System.out.print(e + " ");
}
// add() 메소드를 이용한 요소의 저장
hs02.add("임꺽정");
hs02.add("홍길동");
hs02.add("이순신");
// iterator() 메소드를 이용한 요소의 출력
Iterator<String> iter02 = hs02.iterator();
while (iter02.hasNext()) {
System.out.print(iter02.next() + " ");
}
// size() 메소드를 이용한 요소의 총 개수
System.out.println("집합의 크기 : " + hs02.size());
- result
true
false
홍길동 이순신 임꺽정
홍길동 이순신 임꺽정
집합의 크기 : 3
Member.java
package ch12;
public class Member {
private int memberId; //회원 아이디
private String memberName; //회원 이름
public Member(int memberId, String memberName){ //생성자
this.memberId = memberId;
this.memberName = memberName;
}
public int getMemberId() { //
return memberId;
}
public void setMemberId(int memberId) {
this.memberId = memberId;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
// HashSet에서는 값이 같은지 판단하는 기준을 세워줘야 하기에
// equals와 HashCode를 재정의 해야한다.
@Override
public int hashCode() {
// TODO Auto-generated method stub
return memberId;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if (obj instanceof Member) {
Member member = (Member)obj;
if(this.memberId == member.memberId) {
return true;
}
else return false;
}
return false;
}
@Override
public String toString(){ //toString 메소드 오버로딩
return memberName + " 회원님의 아이디는 " + memberId + "입니다";
}
}
MemberHashSet.java
package ch12;
import java.util.HashSet;
import java.util.Iterator;
// HashSet은 집합처럼 동일한 값이 들어오는 것을 막을 수 있다.
// 하지만 동일한 값은 equals, hashCode를 재정의하며 직접 정해줘야한다.
public class MemberHashSet {
// member를 HashSet로 관리하기 위해 만든 class
private HashSet<Member> hashSet;
public MemberHashSet() {
hashSet = new HashSet<>();
}
public MemberHashSet(int size) {
hashSet = new HashSet<>(size);
}
public void addMember(Member member) {
hashSet.add(member);
}
public boolean removeMember(int memberId){ // 멤버 아이디를 매개변수로, 삭제 여부를 반환
Iterator<Member> ir = hashSet.iterator();
// <>안에는 반복 할 자료형을 입력
while(ir.hasNext()) {
Member member = ir.next();
int tempId = member.getMemberId();
if(tempId == memberId){
hashSet.remove(member);
// 위의 코드에서는 index를 지정하여 remove한 코드
// 현재 코드는 iterator를 member object를 사용하기에 object를 빈칸에 입력
return true;
}
}
System.out.println(memberId + "가 존재하지 않습니다"); //for 가 끝날때 까지 return 이 안된경우
return false;
}
public void showAllMember() {
for (Member member: hashSet) {
System.out.println(member);
}
System.out.println();
}
}
MemberHashSetTest.java
package ch12;
public class MemberHashSetTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
MemberHashSet memberHashSet = new MemberHashSet();
Member memberLee = new Member(1001, "이순신");
Member memberKim = new Member(1002, "김유신");
Member memberKang = new Member(1003, "강감찬");
Member memberHong = new Member(1003, "강감찬");
memberHashSet.addMember(memberLee);
memberHashSet.addMember(memberKim);
memberHashSet.addMember(memberKang);
memberHashSet.addMember(memberHong);
memberHashSet.showAllMember();
memberHashSet.removeMember(memberKim.getMemberId());
memberHashSet.showAllMember();
}
}