Ch11-37~38. HashSet
0. 목차
Chapter11. 컬렉션 프레임웍
Ch11 - 37. HashSet 예제3
Ch11 - 38. HashSet 예제4
Ch11 - 37. HashSet 예제3
▶ HashSet이란?
▷ (저장)순서 허용X, 중복 허용X
▷ HashSet은 객체 저장 전, 기존에 같은 객체가 있는지 확인(중복 확인)
- 같은 객체가 없으면 저장(중복X → 저장)
- 같은 객체가 있으면 저장 안 함(중복 → 저장X)
▷ boolean add(Object o)는
저장 할 객체의 equals()
와 hashCode()
를 호출
- 중복을 체크하기 위함
- equals()와 hashCode()가 오버라이딩 되어 있어야 중복 확인 가능
▷ 중복 확인 예시
class Person { // extends Object 생략, [Object] ⊃ equals(), hashCode(), 그래도 중복 확인 시, 오버라이딩 필수
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
Public String toString() {
return name + ":" + age;
}
}
- equals() 오버라이딩
public boolean equals(Object obj) { if (!(obj instanceOf Person)) return false; // 형변환 전 instanceOf로 확인 Person tmp = (Person)obj; // 형변환, Person에 있는 기능 사용하려면 Person 리모콘이 있어야 함 return name.equals(tmp.name) && age == tmp.age; // iv 끼리 확인 }
- hashCode() 오버라이딩
public int hashCode() { // old return (name + age).hashCode(); // String + int = String // new return Objects.hash(name, age); // hash 끼리 확인 }
▶ Hashset에서 왜 중복 된 결과가 나왔나?
import java.util.*;
class Ex11_11 {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add("abc");
set.add("abc");
set.add(new Person("David",10));
set.add(new Person("David",10));
System.out.println(set);
}
}
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return name +":"+ age;
}
}
// console
[David:10, David:10, abc]
▶ 중복 허용 하지 않도록 하기
▷ equals()
와 hashCode()
오버라이딩
▷ 이클립스에서 만들어 준 equals()
와 hashCode()
오버라이딩 수정
▶ 전체
package baek;
import java.util.HashSet;
import java.util.Objects;
import sun.net.www.content.text.plain;
public class PlayHashSet3 {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add("abc");
set.add("abc");
set.add(new Person("David", 10));
set.add(new Person("David", 10));
System.out.println(set);
}
}
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Person)) return false;
Person tmp = (Person)obj;
return name.equals(tmp.name) && age == tmp.age;
}
public String toString() {
return name + ":" + age;
}
}
// console
[David:10, abc]
Ch11 - 38. HashSet 예제4
▶ 교집합
▷ retainAll()
HashSet setA = new HashSet();
HashSet setB = new HashSet();
setA.add("1");
setA.add("2");
setA.add("3");
setA.add("4");
setA.add("5");
System.out.println("A" + setA);
setB.add("4");
setB.add("5");
setB.add("6");
setB.add("7");
setB.add("8");
System.out.println("B" + setB);
// console
A[1, 2, 3, 4, 5]
B[4, 5, 6, 7, 8]
setA.retainAll(setB); // 공통
System.out.println("A∩B" + setA);
// console
A[1, 2, 3, 4, 5]
B[4, 5, 6, 7, 8]
A∩B[4, 5]
▶ 합집합
▷ addAll()
setA.addAll(setB); // A+B
System.out.println("A∪B" + setA);
// console
A[1, 2, 3, 4, 5]
B[4, 5, 6, 7, 8]
A∪B[1, 2, 3, 4, 5, 6, 7, 8]
▶ 차집합
▷ removeAll()
setA.removeAll(setB); // A-B
System.out.println("A-B" + setA);
// console
A[1, 2, 3, 4, 5]
B[4, 5, 6, 7, 8]
A-B[1, 2, 3]