[JAVA] 컬렉션 프레임웍 : HashSet

DongGyu Jung·2022년 2월 23일
0

자바(JAVA)

목록 보기
35/60
post-thumbnail

🏃‍♂️ 들어가기 앞서..

본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 Page : 〔투 비 마스터 : 자바〕

*해당 교재의 목차 순서와 구성을 참고하여 작성하며
각 내용마다 부족할 수 있는 내용이나 개인적으로 궁금한 점은
추가적인 검색을 통해 채워나갈 예정입니다.



HashSet

Set 인터페이스를 구현한 컬렉션
가장 대표적이고 가장 일반적으로 쓰이는 Set

  • " 순서를 유지해야 하는 경우 "LinkedHashSet 클래스 사용
  • 특징 : " 중복 불가 " : 새로운 요소를 추가할 때( add / addAll 등), 중복된 요소일 경우 false 반환

※ 생성자

Method설명
HashSet()크기 0인 " HashSet 생성
HashSet( Collection c )지정 Collection이 저장된 " HashSet 생성
HashSet( int initialCapacity )용량 지정 HashSet 생성
HashSet( int initialCapacity, float loadFactor )용량 지정 HashSet 생성
loadfactor : 언제 용량으로 늘릴 것인지
Iterator iterator()HashSet의 Iterator 반환
Object[] toArray()HashSet 저장 객체를 " 객체배열 "로 반환
Object[] toArray( Object[] a )" 지정된 배열 "에 HashSet의 객체를 저장해서 반환

※ 추가 / 삭제

Method설명
boolean add( Object o )에 객체를 추가
boolean addAll( Collection c )
" 집합 "
주어진 Collection의 모든 객체 추가
[ 복사 ]
Object clone()ArrayList 복제
[ 삭제 ]
boolean remove( Object o )객체 지정 삭제
boolean removeAll( Collection c )
" 집합 "
지정 Collection에 포함된 객체 삭제
boolean retainAll( Collection c )
" 집합 "
지정 Collection에 포함된 객체 제외 나머지 삭제
( 변화 有 : true / 변화 無 : false )
void clear()모두 삭제

※ 조회

Method설명
boolean contains( Object o )지정된 객체가 HashSet에 포함되어 있는지 확인
boolean containsAll( Collection o )지정 Collection의 모든 객체가 HashSet에 포함되어 있는지 확인
boolean isEmpty()비어있는지 여부
int size()객체 갯수 조회

《 로또 번호 뽑기 》
정렬을 할 수 없는 Set를 정렬하기 위해선 List로 변환해주어야 한다.

import java.util.* ;

class lotto {
	public static void main(String[] args) {
    	Set set = new HashSet() ;
        
        for (int i = 0; set.size() < 6 ; i++) { // 6개의 번호 뽑기
        	int num = (int)(Math.random() *45) + 1 // 소수형태로 나오기 때문에 (int) 형변환 
            // Math.random은 0~1미만의 범위기 때문에 *45 한 후 +1
            set.add(new Integer(num)) ;
        }
        
        /* Set 정렬하는 방법 */
        List list = new LinkedList(set) ; // LinkedList(Collection c) : sort() 메서드는 List인터페이스 타입 필요 
        Collections.sort(list) ; // Collection"s" 클래스 사용 _ 작은 숫자부터 출력하기
        System.out.println(list)
        
    }
}

또한 여기서도
equals()를 주의해야한다.

Set는 중복값을 저장할 수 없다고하지만
" 값이 같고 타입이 같더라도 다른 인스턴스의 같은 값들일 경우, 서로 다른 것이라고 판단되어 "
중복이 아니게 된다.
그렇게 되면 결과적으론 중복값이 허용되는 것처럼 보이는 것이다.


그렇기 때문에
기본적으로 객체를 지정하기 전에
값이 같게 인스턴스가 생성될 가능성이 있는 경우에는

그 인스턴스를 생성하는 클래스에서
equals() ( hashCode()도 마찬가지 ) 를 오버라이딩해주어야 한다.

/* Person이라는 객체 내부 _ name 변수와 age 변수 존재 */

@Override
public boolean equals(Object obj) {
	if (!(obj instanceof Person)) { // 우선 해당 클래스 타입이 맞는지
    	return false ;// 아니면 서로 다른 것이기 떄문에 false
    }
    Person p = (Person)obj ; // 밑에 name이나 age 변수가 Object엔 없어서 조회불가하기 때문에 형변환 필수
    return this.name.equals(p.name) && this.age == p.age ;
}

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

0개의 댓글