Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 스프링 핵심 원리
- springdatajpa
- Greedy
- http
- java
- 그리디
- Servlet
- 자바
- 스프링 핵심 기능
- 백준
- JDBC
- Exception
- 알고리즘
- QueryDSL
- 스프링
- Android
- db
- SpringBoot
- JPQL
- pointcut
- Thymeleaf
- kotlin
- Proxy
- spring
- 김영한
- 인프런
- AOP
- jpa
- transaction
- Spring Boot
Archives
- Today
- Total
개발자되기 프로젝트
중복 허용하지 않는 Set 인터페이스 본문
1. HashSet클래스
- Set인터페이스를 구현한 클래스와
- 멤버의 중복 여부를 체크하기 위해 인스턴스의 동일성을 확인해야함
- 동일성 구현을 위해 필요에 따라 equals()와 hashCode()메서드를 재정의
2. HahsSet 활용
- 앞 글에서 사용한 ArrayList를 HashSet으로 변경해보자.
public class MemberHashSet {
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 Member getMember(int memberId){
Iterator<Member> iterator = hashSet.iterator();
while (iterator.hasNext()){
Member member = iterator.next();
if (member.getMemberId() == memberId){
return member;
}
}
return null;
}
public boolean removeMember(int memberId){
Iterator<Member> iterator = hashSet.iterator();
while (iterator.hasNext()){
Member member = iterator.next();
if (member.getMemberId() == memberId){
hashSet.remove(member);
return true;
}
}
System.out.println("memberId :" + memberId + "존재하지 않습니다.");
return false;
}
public void showAllMember(){
for (Member member : hashSet) {
System.out.println("member = " + member);
}
System.out.println();
}
public int getSize(){
return hashSet.size();
}
}
- HashSet은 중복을 허용 안하니 member1과 동일한 member는 add해도 사이즈가 변하지 말아야 한다.
public class MemberHashSetTest {
MemberHashSet memberHashSet;
@BeforeEach
void beforeTest(){
memberHashSet = new MemberHashSet();
Member member1 = new Member(1001, "A");
Member member2 = new Member(1002, "B");
Member member3 = new Member(1003, "C");
Member member4 = new Member(1004, "D");
memberHashSet.addMember(member1);
memberHashSet.addMember(member2);
memberHashSet.addMember(member3);
memberHashSet.addMember(member4);
}
@Test
void addMemberTest(){
//given
Member member = new Member(1001, "A");
//when
memberHashSet.addMember(member);
//then
assertEquals(memberHashSet.getSize(), 4);
memberHashSet.showAllMember();
}
}
- 따라서 member1과 동일한 member를 추가하면 size는 4로 동일해야 하나.. 5이다.
- debug를 해보면 Member가 중복되게 들어갔다.
- 왜냐? Member 내부에 같은 Member라고 정의할 수 있는 방법을 가지고 있지 않기 때문.
- equals(), hashCode()
- HashSet에서 객체가 동일하지 확인하기 위해 해당 클래스의 equals(), hashCode()를 사용함.
- equals(): 객체가 논리적으로 동일한지 확인.
- hashCode(): hashCode반환
@Override
public boolean equals(Object o) {
if (o instanceof Member){
Member member = (Member) o;
if (this.memberId == member.memberId){
return true;
}
else return false;
}
return false;
}
@Override //hashcode반환
public int hashCode() {
return memberId;
}
- 테스트를 다시 실행해보자.
- 논리적으로 동일한 객체를 HashSet에 add해보자.
- 기존에 size가 4이기 때문에 add실행을 해도 4로 유지되어야 한다.
@Test
void MemberOverlapTest(){
//given
Member member = new Member(1001, "A");
//when
memberHashSet.addMember(member);
//then
assertEquals(memberHashSet.getSize(), 4);
memberHashSet.showAllMember();
}
- 짠
3. GitHub: 211025 HashSet
'Java > 자료구조' 카테고리의 다른 글
Pair로 관리하는 Map (0) | 2021.10.25 |
---|---|
정렬을 위한 TreeSet 활용 (0) | 2021.10.25 |
Collection 요소를 순회하는 Iterator (0) | 2021.10.24 |
List 인터페이스를 구현한 클래스, 활용 (0) | 2021.10.24 |
컬렉션 프레임워크 (0) | 2021.10.24 |
Comments