[Java] HashSet

SeongWon Oh·2021년 8월 20일
0

Java

목록 보기
27/39
post-thumbnail

HashSet Class

  • HashSet은 set interface를 구현한 컬렉션 클래스로서 데이터의 중복 저장을 허용하지 않으며 저장 순서 유지를 하지 않는다는 특징이 있다.

  • Set 컬렉션 클래스에서 가장 많이 사용되는 클래스 중 하나이다.

  • HashSet class는 Hash Algorithm을 사용하여 검색 속도가 빠르다.

  • 멤버들의 중복 여부를 체크하기 위해 인스턴스의 동일성을 확인해야한다. 이를 위해 필요에 따라 equals()와 hashCode()메서드를 재정의 해줘야한다.


👨🏻‍💻 Example Code1

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

👨🏻‍💻 Example Code2

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

	}

}



Reference

profile
블로그 이전했습니다. -> https://seongwon.dev/

0개의 댓글