🎯 목표 : HashSet의 활용방법과 이해
📒 HashSet
❗특징

- Set 인터페이스를 구현한 대표 컬랙션 클래스
- 순서가 없고 중복이 허용되지 않는다.
- 순서를 유지하려면, LinkedHashSet 클래스를 사용하면 된다.
- 객체를 추가할때 hashCode() , equals() 메소드를 호출하여 해시코드와 값을 비교하여 중복 값인지 확인하기 때문에, 기본형 객체 외 사용자 지정 데이터 객체를 입력할때는 hashCode()와 equals() 메소드를 오버라이딩 해야된다.
📌 예제 1 ) HashSet은 순서가 없다.
import java.util.*;
class HashSetStudy2 {
public static void main(String[] args) {
Set set = new HashSet();
for (int i = 0; set.size() < 6 ; i++) {
int num = (int)(Math.random()*45) + 1;
set.add(num);
}
// 1~ 45 숫자중 6개 int값을 HashSet에 추가 한다.
// HashSet는 순서가 없기 때문에 리스트를 출력하면 정렬되지 않은 난수로 출력된다.
System.out.println(set);
List list = new LinkedList(set); // List 형변환
Collections.sort(list); // 정렬 해줌
System.out.println(list);
// 정렬을 하기위해 List 타입으로 형변환을 하여 배열 구조를 만들어 기본 정렬 기준으로 정렬한다.
}
}
출력값 # 실행할때마다 값이 변한다
[33, 37, 6, 42, 28, 30] # 정렬 X
[6, 28, 30, 33, 37, 42] # 정렬 O
📌 예제 2 ) HashSet이 정상 작동을 위해 equals와 hashcode메소드를 오버라이딩 해줘야된다.
import java.util.*;
class HashSetStudy3 {
public static void main(String[] args) {
HashSet set = new HashSet();
Person a = new Person("David",10);
Person b = new Person("David",10);
set.add(a);
set.add(b);
set.add("abc");
set.add("abc");
System.out.println("a.equals(b) = "+a.equals(b));
System.out.println("a의 해시코드 = "+a.hashCode());
System.out.println("b의 해시코드 = "+b.hashCode());
System.out.println("HashSet = "+set);
}
}
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return name +":"+ age;
}
}
출력값
a.equals(b) = false
a의 해시코드 = 1670782018
b의 해시코드 = 1706377736
HashSet = [abc, David:10, David:10]
- 위의 코드는 Person의 객체 a,b 를 equals로 비교하게되면 false가 나오고 해시코드도 다르게 출력되기 때문에 같은 값으로 인식하지 않고 hashSet에 데이터를 저장하게 된다.
- Person 클래스에 equals와 hashCode메소드를 아래와 같이 오버라이딩 해주면, HashSet이 의도한 대로 정상 작동 할것이다.
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return name +":"+ age;
}
// equals 와 hashcode 메소드를 오버라이딩 해줘야 HashSet이 정상 작동함
public boolean equals(Object obj) {
if(!( obj instanceof Person)) return false;
Person p = (Person) obj;
return this.name.equals(p.name) && this.age==p.age;
// Person의 인스턴스 변수를 사용하기 위해서는 형변환을 해줘야
}
public int hashCode() {
return Objects.hash(name,age);
}
}
출력값
a.equals(b) = true
a의 해시코드 = 2039984119
b의 해시코드 = 2039984119
HashSet = [David:10, abc]'Language > JAVA' 카테고리의 다른 글
| Java HashMap (Interface Map) (0) | 2022.08.29 |
|---|---|
| Java Class TreeSet(Interface Set) (0) | 2022.08.28 |
| Java Comparator 와 Comparable (0) | 2022.08.28 |
| Java Class Arrays (0) | 2022.08.28 |
| Java Iterator (0) | 2022.08.28 |