Java/이것이자바다

15.3.1 HashSet

유호야 2020. 12. 4. 13:49
반응형

HashSet은 Set 인터페이스의 구현 클래스이다. HashSet을 생성하기 위해서는 다음과 같이 기본 생성자를 호출하면 된다.

Set<E> set = new HashSet<E>();

타입 파라미터 E에는 컬렉션에 저장할 객체 타입을 지정하면 된다. 예를 들어 String 객체를 저장하는 HashSet은 다음과 같이 생성할 수 있다.

Set<String> set = new HashSet<String>();

HashSet은 객체들은 순서 없이 저장하고 동일한 객체는 중복 저장하지 않는다. HashSet이 판단하는 동일한 객체란 꼭 같은 인스턴스를 뜻하지는 않는다. HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출해서 해시코드를 얻어낸다. 그리고 이미 저장되어 있는 객체들의 해시코드와 비교하낟. 만약 동일한 해시코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.

문자열을 HashSet에 저장할 경우, 같은 문자열을 갖는 String 객체는 동등한 객체로 간주되고 다른 문자열을 갖는 String 객체는 다른 객체로 간주되는데, 그 이유는 String 클래스가 hashCode()와 equals() 메소드를 재정의해서 같은 문자열일 경우 hashCode()의 리턴값을 같게, equals()의 리턴값은 true가 나오도록 했기 때문이다. 다음 예제는 HashSet에 String 객체를 추가, 검색, 제거하는 방법을 보여준다.

HashSetExample1.java : String 객체를 중복 없이 저장하는 HashSet

package bb.bb.bb;

import java.util.*;

public class HashSetExample1 {

	public static void main(String[] args) {
		
		Set<String> set = new HashSet<>();
		
		
		//String str = set.get(1);
		//순서가 없기 때문에 불가능
		//boolean isThere = set.contains("Kotlin");
		//System.out.println(isThere);
		
		set.add("Java");
		set.add("JDBC");
		set.add("Servlet/JSP");
		set.add("Java"); //중복 추가가 불가능하다.
		set.add("iBATIS");
		
		int setSize = set.size();
		System.out.println("set HashSet의 객체의 개수는 " + setSize + "개입니다.");
		
		
		Iterator<String> iterator = set.iterator(); //반복자 얻기
		while(iterator.hasNext()) {
			String element = iterator.next();
			System.out.println("\t" + element);
		}
		
		set.remove("iBATIS");
		set.remove("JDBC");
		int newSetSize = set.size();
		System.out.println("set HashSet의 객체의 개수는 " + newSetSize + "개입니다.");
		
		iterator = set.iterator(); //반복자 얻기
		while(iterator.hasNext()) { //객체 수만큼 루핑
			String element = iterator.next();
			System.out.println("\t" + element);
		}
		
		set.clear();
		if(set.isEmpty() == true) {
			System.out.println("비어있음");
		}
		
		
		
	}

}

 

다음은 사용자 정의 클래스인 Member를 만들고 hashCode()와 equals() 메소드를 오버라이딩 하였다. 인스턴스가 달라도 이름과 나이가 동일하다면 동일한 객체로 간주하여 중복 저장되지 않도록 하기 위해서이다.

Member.java : hashCode()와 equasl() 메소드 재정의

반응형

'Java > 이것이자바다' 카테고리의 다른 글

국영수 점수 총합 및 평균  (0) 2021.05.04
15.4 Map 컬렉션  (0) 2020.12.09
15.3 Set 컬렉션  (0) 2020.12.03
15.2.2 Vector  (0) 2020.12.03
15.2.1 ArrayList  (0) 2020.12.03