HashSet의 가장 큰 특정은 중복을 걸러낸다는 것이다.
즉, Java에서 무언가 중복 없이 저장해 놓고 싶을 때 사용하면 좋은 class이다.
중복을 허락하지 않고 정렬이 필요 없는 경우에 HashSet을 사용한다.
Set의 경우, 순서가 없기때문에 index가 있을 수 없다. 따라서 특정 index에 있는 무언가를 가져오고 싶을 때는 HashSet을 사용할 수 없다.
또한 값을 추가하거나 삭제하는 것이 많은 알고리즘을 구현할 때 HashSet의 사용은 피하는 것이 좋다.
→ 값 추가/삭제에 시간이 오래 소요되기 때문이다.
import java.util.HashSet;
public class Exam0110 {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
// Set에 값 추가하기
set.add(new String("aaa"));
set.add(new String("bbb"));
set.add(new String("ccc"));
// Set은 집합의 특성을 따른다.
// 같은 값을 중복해서 넣을 수 없다.
set.add(new String("aaa"));
set.add(new String("bbb"));
set.add(null);
set.add(null);
System.out.println(set);
}
}
// HashSet과 사용자 정의 데이터 타입 - hashCode()와 equals() 모두 오버라이딩
import java.util.HashSet;
import java.util.Objects;
public class Exam0340 {
// 사용자 정의 데이터 타입
static class Member {
String name;
int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Member [name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
return Objects.hash(age, name);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Member other = (Member) obj;
return age == other.age && Objects.equals(name, other.name);
}
}
public static void main(String[] args) {
Member v1 = new Member("홍길동", 20);
Member v2 = new Member("임꺽정", 30);
Member v3 = new Member("유관순", 16);
Member v4 = new Member("안중근", 20);
Member v5 = new Member("유관순", 16);
System.out.printf("v3 == v5: %b\n", v3 == v5);
System.out.printf("equals(): %b\n", v3.equals(v5));
System.out.printf("hashCode(): %d, %d\n", v3.hashCode(), v5.hashCode());
HashSet<Member> set = new HashSet<>();
set.add(v1);
set.add(v2);
set.add(v3);
set.add(v4);
set.add(v5); // 중복 저장되지 않는다.
System.out.println(set);
}
}
put(key,value) : 맵에 값 저장하기
map.put("s01", new Member("홍길동", 20));
1. "s01" String 객체에 대해 hashCode()를 호출하여 해시 값을 얻는다.
2. 그 해시 값을 사용하여 저장할 위치를 결정한다.
3. 해당 위치에 Member 객체(의 주소)를 저장한다.
get(key) : 맵에서 값 꺼내기
System.out.println(map.get("s01"));
1. key 객체에 대해 hashCode()를 호출한다.
2. hashCode()의 리턴 값을 가지고 데이터를 찾을 위치를 결정한다.
3. 해당 위치에 있는 key 객체에 대해 equals()를 호출하여 리턴값을 확인한다.
4. equals()의 리턴 값이 true라면 같은 key로 간주하여 해당 위치의 값을 꺼낸다.
mport java.util.HashMap;
public class Exam0110 {
public static void main(String[] args) {
HashMap<String,Member> map = new HashMap<>();
map.put("s01", new Member("홍길동", 20));
map.put("s02", new Member("임꺽정", 30));
map.put("s03", new Member("유관순", 16));
map.put("s04", new Member("안중근", 20));
// 이전에 저장할 때 사용한 같은 키로 다른 값을 저장하면 기존 값을 덮어쓴다.
map.put("s02", new Member("윤봉길", 30));
System.out.println(map.get("s01"));
System.out.println(map.get("s02"));
System.out.println(map.get("s03"));
System.out.println(map.get("s04"));
// 존재하지 않는 key를 지정하면 null을 리턴한다.
System.out.println(map.get("s05"));
}
}