Set 인터페이스의 구현 클래스
객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않음.
HashSet이 판단하는 동일한 객체란 꼭 같은 인스턴스를 뜻하지 않음
HashSet은 객체를 저장하기 전에
1) 먼저 객체의 hashCode() 메소드들 호출해서 해시코드를 얻어내고, 이미 저장되어 있는 객체들의 해시코드와 비교
2) 만약 동일한 해시코드가 있다면 다시 equals()메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않음
null 입력은 가능하지만 한 번만 저장 가능하고 중복될 수 없습니다.
객체(데이터)를 중복 저장할 수 없고, 순서를 보장하지 않습니다.
package chapter20230905.HashSet;
import java.util.*;
public class HashSet_01 {
public static void main(String[] args) {
HashSet<String> hashSet = new HashSet<>();
hashSet.add(new String("임정순"));
hashSet.add(new String("박현정"));
hashSet.add(new String("홍연의"));
hashSet.add(new String("강감찬"));
hashSet.add(new String("강감찬"));
// 중복된 문자열은 제거되고 출력 순서의 입력 순서는 상관 없음
System.out.println(hashSet);
}
}
package chapter20230905.HashSet;
import java.util.*;
public class HashSet_02 {
public static void main(String[] args) {
// String 객체를 중복 없이 저장하는 HashSet
Set<String> set = new HashSet<>();
set.add("Java");
set.add("JDBC");
set.add("Servlet/JSP");
set.add("Java"); // Java 는 한번만 저장됨
set.add("iBATIS");
int size = set.size(); // 저장된 객체수 얻기
System.out.println("총 객체수 : " + size); // 총 객체수 : 4
System.out.println("foreach 문으로 출력 시작");
for(String s : set) {
System.out.println("\t" + s);
}
System.out.println();
Iterator<String> iterator = set.iterator(); // 반복자 얻기
while (iterator.hasNext()) { // 객체 수만큼 루핑
String element = iterator.next(); // 1개의 객체를 가져옴
System.out.println("\t" + element);
}
set.remove("JDBC"); // 1개의 객체 삭제
set.remove("iBATIS"); // 1개의 객체 삭제
System.out.println("총 객체수 : " + set.size());
System.out.println("foreach 문으로 출력 시작");
for(String s : set) {
System.out.println("\t" + s);
}
System.out.println();
set.clear(); // 모든 객체를 제거하고 비움
if(set.isEmpty()) { // 스택이 비었는지 확인하여 true false
System.out.println("비어 있음");
}
}
}
package chapter20230905.HashSet;
import java.util.*;
// Member 객체를 중복없이 저장하는 HashSet
// hashCode()와 equals() 메소드를 재정의 하지 않으면 저장된 객체가 2개
class MemberShip {
/* hashCode()와 equals() 매서드 재정의 */
private String name;
private int age;
public MemberShip(String name, int age) {
this.name = name;
this.age = age;
}
/* hashCode()와 equals() 매서드 재정의 */
@Override
public int hashCode() {
// name과 age 값이 같으면 동일한 hashcode 반환
return name.hashCode() + age; // String의 hashCdoe() 이용
}
@Override
public boolean equals(Object obj) { // name과 age값이 같으면 true 리턴
// name과 age 값이 같으면 true 반환
if (obj instanceof MemberShip) {
MemberShip memberShip = (MemberShip) obj;
return memberShip.name.equals(this.name) && (memberShip.age == age);
}
else {
return false;
}
}
}
public class HashSet_03 {
public static void main(String[] args) {
Set<MemberShip> set = new HashSet<>();
// 인스턴스는 다르지만 내부 데이터가 동일하므로 객체 1개만 저장
set.add(new MemberShip("홍길동", 30));
set.add(new MemberShip("홍길동", 30));
System.out.println("총 객체수 : " + set.size()); // 총 객체수 : 1
}
}