자바의 정석 - HashSet

Yohan·2024년 2월 12일
0
post-custom-banner

HashSet

  • HashSet
    • 순서X, 중복X
    • Set인터페이스를 구현한 대표적인 컬렉션 클래스
    • 순서를 유지하려면 LinkedHashSet클래스 사용
  • TreeSet
    • 범위 검색과 정렬에 유리한 컬렉션 클래스 (from ~ to, 10 ~ 20)
    • HashSet보다 데이터 추가, 삭제에 시간이 더 걸림

HashSet 주요 메서드

  • HashSet() - 생성자
  • HashSet(Collection c)
  • HashSet(int initialCapacity) - 초기용량
  • HashSet(int initialCapacity, float loadFactor) - loadFactor : 언제 (0.8이면 80%가 될 때 용량을 x2)

  • add(Obejct o) - 추가
  • addAll(Collection c) - 합집합
  • remove(Obejct o) - 삭제
  • removeAll(Collection c) - 차집합
  • retainAll(Collection c) - 교집합
  • void clear() - 모두 삭제

  • contains(0bject o) - 포함?
  • containsAll(Collection c) - 여러 객체가 모두 포함?

  • isEmpty() - 비었는지?
  • size() - 저장된 객체 수
  • Object[ ] toArray() - 객체를 객체배열로 반환

실습1

  • HashSet()은 중복 x
class Ex1 {
	public static void main(String[] args) {
		Object[] objArr = {"1", new Integer(1), "2", "2", "3", "3", "4", "4", "4"};
		Set set = new HashSet();
		
		for(int i=0;i<objArr.length; i++) {
			set.add(objArr[i]); // HashSet에 objArr의 요소들을 저장
		}
		// HashSet에 저장된 요소들을 출력
		System.out.println(set);
		
		// HashSet에 저장된 요소들을 출력 (Iterator 이용)
		Iterator it = set.iterator();
		
		while(it.hasNext()) { // 읽어올 요소가 있는지 확인
			System.out.println(it.next()); // 요소 하나 꺼내오기
		}
	}
}

실습2

  • HashSet()은 순서 x -> list에 넣으면 순서o (정렬 가능)
class Ex1 {
	public static void main(String[] args) {
		Set set = new HashSet();
		
		// set의 크기가 6보다 작은 동안 1~45사이의 난수를 저장
		for(int i=0;set.size()<6; i++) {
			int num = (int)(Math.random()*45) +1;
			set.add(num);
		}
		
		List list = new LinkedList(set); // 1. set의 요소를 list에 저장 (set은 정렬 불가)
		Collections.sort(list); // 2. list를 정렬
		System.out.println(list); // 3. list 출력
		}
}

실습3

  • HashSet은 객체를 저장하기 전에 기존에 같은 객체가 있는지 확인
    -> 같은 객체가 없으면 저장하고, 있으면 저장하지 않는다.
  • boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출하여 중복여부 확인
    -> equals()와 hashCode()가 오버라이딩 되어 있어야 함
class Ex1 {
	public static void main(String[] args) {
		Set set = new HashSet();
		
		set.add("abc");
		set.add("abc"); // 중복이라 저장x
		set.add(new Person("David",10)); // equals() & hashCode() 구현해야 중복x
		set.add(new Person("David",10));
		
		System.out.println(set); 
		}
}

class Person {
	String name;
	int age;
	
	@Override
	public int hashCode() {
		return Objects.hash(name, age);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj; // obj에는 name, age가 없기 때문에 Person으로 형변환
		return age == other.age && Objects.equals(name, other.name);
	}

	Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public String toString() {
		return name + ":" + age;
	}
}

실습4

  • addAll(Collection c) - 합집합
  • removeAll(Collection c) - 차집합
  • retainAll(Collection c) - 교집합
setA.retainAll(setB); // 교집합. 공통된 요소만 남기고 삭제
setA.addAll(setB); // 합집합. setB의 모든 요소를 추가 (중복 제외)
setA.removeAll(setB); // 차집합. setB와 공통 요소를 제거
profile
백엔드 개발자
post-custom-banner

0개의 댓글