/ JAVAJUNGSUK

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]
AB[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]
AB[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]