🏃♂️ 들어가기 앞서..
본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 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) ;
}