java - HashSet

imjingu·2023년 9월 5일
0

개발공부

목록 보기
458/481

HashSet

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
		
	}
}

0개의 댓글