판봉 개발 일기

Set 컬렉션중 하나인 HashSet에 대하여 알아보자 본문

자바 복습

Set 컬렉션중 하나인 HashSet에 대하여 알아보자

판봉 2021. 7. 13. 16:41
728x90

HashSet은 Set 인터페이스의 구현 클래스이다.

HashSet을 생성하는 방법은 다음과 같이 기본 생성자를 호출하면 된다.

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

String 객체를 저장하는 HashSet은 다음과 같이 생성할 수 있다.

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

 

무언가 어디서 많이 본것 같은건 비밀..

 


HashSet은 객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않는다는게 포인트이다.

HashSet이 판단하는 동일한 객체란 꼭 같은 인스턴스만을 의미하지 않는다.

HashSet은 객체를 저장하기 전에 먼저 hashCode()메소드를 호출하여 해시코드를 얻고,

객체들의 해시코드를 비교한다.

만약 동일한 해시코드가 있다면 다시 equals()메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하게된다.

 

※번외로 String 클래스가 hashCode()와 equals()메소드를 재정의하기 때문에 같은 문자열이면 hashCode()의 리턴값은 같게되고 equals()의 리턴값을 true가 나온다.

다음 코드는 HashSet에 String 객체를 추가, 검색, 제거하는 방법이 써져있다.

import java.util.*;

public class HashSetExample {
	public static void main(String[] argS) {
    Set<String> set = new HashSet<String>();
    
    set.add("Java");
    set.add("JDBC");
    set.add("Servlet/JSP는 아직 모르겠어");
    set.add("Java");
    set.add("iBATIS가 도대체뭐야");
    
    int size = set.size()
    System.out.println("총 객체수: " + size);
    
    Iterator<String> iterator = set.iterator();
    while(iterator.hasNext()) {
   		String element = iterator.next();
        System.out.println("\t" + element);
    }
    
    set.remove("JDBC");
    set.remove("iBATIS가 도대체뭐야");
    
    System.out.println("총 객체수: " + set.size();
    
    iterator = set.iterator();
    for(String element : set) { // for- each문이다.
    	System.out.println("\t" + element);
    }
    
    set.clear();
    if(set.isEmpty()) { System.out.println("당연히 비어 있을 수 밖에 없지");}
    }
}

Set 컬렉션에 대해 설명한 글의 링크이다.

혹시 모르니 참고하실 분들은 참고하세요.

https://panbong-development.tistory.com/entry/Set-%EC%BB%AC%EB%A0%89%EC%85%98%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

 

Set 컬렉션에 대하여 알아보자

앞서 살펴본 List 컬렉션은 객체의 저장 순서를 유지한다. 하지만 Set 컬렉션은 저장 순서가 유지되지 않는다. 또한 객체의 중복 저장이 불가능 하며, 하나의 null만 저장할 수 있다. Set 컬렉션은 수

panbong-development.tistory.com


다음은 hashCode()와 equals() 메소드를 재정의한 코드이다.

public class Member {
	public String name;
    public int age;
    
    public Member(String name, int age) { // 생성자를 매개변수를 통해 들어오도록 만듬
 	this.name = name; // String name = name; 이라는 뜻이다.
    this.age =age;
     }
     @Override
     public boolean equals(Object obj) { // name과 age값이 같으면 true를 리턴하도록함
     if(obj instanceof Member)  { // obj가 Member형으로 형변환이 된다면 이라는 뜻
     	Member member = (Member) obj;
        return member.name.equals(name) && (member.age==age); //논리곱 둘다 true여야 true
          } else {
          return false;
          }
     }
     
     @Override
     public int hashCode() { // name과 age 값이 같으면 동일한 hashCode를 리턴
     	return name.hashCode() + age;
     
     }
}
import java.util.*;

public class HashSetExample2 {
	public static void main(String[] args) {
    	Set<Member> set = new HashSet<Member>();
        
        set.add(new Member("판봉", 100));
        set.add(new Member("판봉", 100)); // 인스턴스는 다르지만 내부데이터가 동일 1개만 저장
        set.add(new Member("판봉", 40));
        
        System.out.println("총 객체수 :" + set.size()); 저장된 모든 객체 수 얻기
    }
}