Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Data Structure
- hash table
- Math
- array
- 구현
- Binary Tree
- Binary Search
- Stack
- Number Theory
- Tree
- database
- dynamic programming
- implement
- 코딩테스트
- 자바
- Method
- string
- 코테
- Counting
- greedy
- 파이썬
- geometry
- bit manipulation
- two pointers
- simulation
- Matrix
- SQL
- sorting
- Class
- java
Archives
- Today
- Total
코린이의 소소한 공부노트
HashSet 클래스 본문
[HashSet 클래스]
1. Set 인터페이스를 구현한 대표적인 컬렉션 클래스
2. 순서를 유지하지 않는다 -> 순서를 유지하려면 LinkedHashSet 클래스를 사용하면 된다.
3. 중복을 허용하지 않는다 -> 객체를 저장하기 전에 기존에 같은 객체가 있는지 확인한다.
[생성자]
HashSet()
// 기본 생성자
HashSet(Collection c)
// c에 저장된 객체를 담은 HaseSet 생성
HashSet(int initialCapacity)
// 초기 용량 설정
HashSet(int initialCapacity, float loadFactor)
// 초기 용량 + 용량을 늘리는 시기 설정
// loadFactor=0.8이면 80%가 찼을 때 용량 늘림
// 보통은 2배로 늘린다.
[메서드]
boolean add(Object o)
// o를 추가
boolean addAll(Collection c)
// c의 모든 객체 추가
// 합집합
boolean remove(Object o)
// o를 삭제 후 성공하면 true 반환
boolean removeAll(Collection c)
// c에 있는 모든 객체 삭제
// 차집합
boolean retainAll(Collection c)
// c에 있는 것만 남기고 삭제
// 교집합
void clear()
// 모두 삭제
boolean contains(Object o)
// o가 포함되어있다면 true 반환
boolean containsAll(Collection c)
// c에 담긴 객체가 모두 포함되어있다면 true 반환
Iterator iterator()
// 이터레이터 객체 불러오기
boolean isEmpty()
// 비어있으면 true 반환
int size()
// 저장된 객체의 개수 반환
Object[] toArray()
// 객체 배열로 반환
Object[] toArray(Object[] a)
// a타입의 객체 배열로 반환
[코드 예시 - HashSet은 순서유지X, 중복허용X]
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의 요소 저장
System.out.println(set); // [1, 1, 2, 3, 4]
// 중복된 요소는 1번만 출력
// 두 1중 하나는 문자열 “1”이고 하나는 숫자 1이다.
// 순서를 유지하지 않기 때문에 어떤 1이 먼저 출력된건지 알 수 없다.
[코드 예시 - 로또 번호 뽑기]
Set set = new HashSet();
for (int i = 0; set.size() < 6 ; i++) {
int num = (int)(Math.random()*45) + 1;
set.add(new Integer(num));
}
// set = [4, 10, 6, 42, 25, 11]
// Set은 순서 유지하지 않으므로 정렬 불가
// 정렬하려면 List에 저장해서 sort()를 써야함
List list = new LinkedList(set); // LinkedList(Collection c)
Collections.sort(list); // Collections.sort(List list)
System.out.println(list); // [4, 6, 10, 11, 25, 42]
[HashSet 사용시 유의사항]
Set은 중복을 허용하지 않기 때문에 add()를 사용할 때는 저장할 객체의 equals()와 hashCode()를 호출한다. 이때 객체에 맞게 equals()와 hashCode()가 오버라이딩 되어 있어야 한다.
예를 들어 아래와 같은 Person 클래스를 하나 만들었다고 생각해보자.
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return name +":"+ age;
}
}
이 상태에서 main()에서 아래와 같은 코드를 사용하면 묘한 상황이 발생한다.
HashSet set = new HashSet();
set.add("abc");
set.add("abc");
set.add(new Person("David",10));
set.add(new Person("David",10));
System.out.println(set); // [abc, David:10, David:10]
"abc"는 중복 제거가 잘 됐지만, Person 클래스에 equals()와 hashCode()가 오버라이딩 되어있지 않아 중복된 내용이 set에 저장됐다. 오버라이딩을 제대로 해주고 다시 실행하면 HashSet이 정상 작동한다.
// Person 클래스 내부
public boolean equals(Object obj){
if(!(obj instanceof Person)) return false;
Person tmp = (Person)obj;
return name.equals(tmp.name) && age==tmp.age;
}
public int hashCode(){
// return (name+age).hashCode(); // 기존에 사용하던 방법. String 클래스의 hashCode() 호출
return Objects.hash(name,age); // 최근에 사용하는 방법.
}
// main()
// 오버라이딩 전 결과: [abc, David:10, David:10]
System.out.println(set); // [abc, David:10]
'Java' 카테고리의 다른 글
HashMap, Hashtable 클래스 (0) | 2022.11.08 |
---|---|
TreeSet 클래스 (0) | 2022.11.07 |
Comparator, Comparable 인터페이스 (0) | 2022.11.05 |
Arrays 클래스 (0) | 2022.11.04 |
Iterator, ListIterator, Enumeration 인터페이스 (0) | 2022.11.03 |