Java HashSet, TreeSet, HashSet의 주요 메서드
by 볼빵빵오춘기더보기
Set 인터페이스를 구현한 대표적인 컬렉션 클래스 - HashSet, TreeSet
HashSet - 순서x, 중복x
- Set 인터페이스를 구현한 대표적인 컬렉션 클래스이다.
- 순서를 유지하려면, LinkedHashSet 클래스를 사용하면 된다.
- 순서x, 중복x
⇒ HashSet은 객체를 저장하기전에 기존에 같은 객체가 있는지 확인
⇒ 같은 객체가 겂으면 저장하고, 있으면 저장하지 않는다.
⇒ boolean add(Object o)는 저장할 객체의 equals와 hashCode()를 호출
⇒ 따라서 equals()와 hashCode()가 오버라이딩 되어 있어야한다.
TreeSet
- 범위 검색과 정렬에 유리한 컬렉션 클래스이다.
- HashSet보다 데이터 추가, 삭제에 시간이 걸린다.
HashSet의 주요 메서드
HashSet의 생성자
- HashSet()
- HashSet(Collection c)
- HashSet(int initialCapacity)
- HashSet(int initialCapacity, float loadFactor)
HashSet 메서드
- boolaen add(Object o)
- boolaen addAll(Collection c)
- boolean remove(Object o)
- boolean removeAll(Collection c)
- boolean retainAll(Collection c)
- void clear()
- boolean contains(Object o)
- boolean containsAll(Collection c)
- Iterator iterator()
- boolean isEmpty()
- int size()
- Object[] toArray()
- Object[] toArray(Object[] a)
예제 코드
예제 코드1
더보기
import java.util.*;
public class Try {
public static void main(String[] args) {
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.add(objArr[i]); );
// => 이 부분 주석처리 해제하고 보면 set에 들어갔는지 아닌지 확인가능
}
System.out.println(set);
Iterator it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
⇒ 핑크색 테두리부분이 순서가 있는것처럼 결과가 나왔지만 순서가 있진않음. 순서를 보장하지않는다!!
예제 코드2
더보기
import java.util.*;
public class Try {
public static void main(String[] args) {
Set set = new HashSet();
for(int i=0;set.size()<6;i++) {
int num = (int)(Math.random()*45)+1;
set.add(new Integer(num));
}
System.out.println(list);
// 정렬되지않은 상태에서 출력이된다.
// 정렬하기위해서는 sort를 이용해야하는데
// 그럴려면 Collections인터페이스에 들어있는 클래스여야만 가능해서 List에 넣은 후 정렬
List list = new LinkedList(set); // LinkedList(Collection c)
Collections.sort(list); // Collections.sort(List list)
System.out.println(list);
}
}
예제 코드3
더보기
순서x, 중복x
⇒ HashSet은 객체를 저장하기전에 기존에 같은 객체가 있는지 확인
⇒ 같은 객체가 없으면 저장하고, 있으면 저장하지 않는다.
⇒ boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출
⇒ 따라서 equals()와 hashCode()가 오버라이딩 되어 있어야함
import java.util.*;
public class Try {
public static void main(String[] args) {
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);
}
}
class Person{
String name;
int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
public String toString() {
return name + " : "+ age;
}
}
⇒ abc는 set에 2번 저장이 안된 것을 확인가능
⇒ David : 10 은 set에 2번 저장됨
why? 같은 객체인지 체크하지 않아서
⇒ equals()와 hashCode()를 오버라이딩해야 HashSet이 바르게 동작한다.
※ 오버라이딩 how?
직접적어도 되나 많이 사용하기 때문에 상단 메뉴탭 이용(source > Generate hashCode() and equals()… 를 선택)하거나
작성할 때 사용할 iv를 선택 창나오면 선택후 generate를 누르면 나온다. 그 후 수정해서 사용하면된다.
예제 코드4
더보기
import java.util.*;
public class Try {
public static void main(String[] args) {
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);
}
}
class Person{
String name;
int age;
@Override
public int hashCode() {
// Objects.hash(Object... values); => 가변 인자
return Objects.hash(age, name);
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Person)) return false;
Person p = (Person) obj;
// 나자신(this)의 이름과 나이를 p와 비교
return this.name.equals(p.name) && this.age == p.age;
}
Person(String name, int age){
this.name = name;
this.age = age;
}
public String toString() {
return name + " : "+ age;
}
}
예제 코드5
더보기
import java.util.*;
public class Try {
public static void main(String[] args) {
HashSet setA = new HashSet();
HashSet setB = new HashSet();
HashSet setHab = new HashSet();
HashSet setKyo = new HashSet();
HashSet setCha = new HashSet();
setA.add("1"); setA.add("2"); setA.add("3");
setA.add("4"); setA.add("5");
System.out.println("A = "+setA);
setB.add("4"); setB.add("5"); setB.add("6");
setB.add("7"); setB.add("8");
System.out.println("B = "+setB);
Iterator it = setB.iterator();
while(it.hasNext()) {
Object tmp = it.next();
if(setA.contains(tmp))
setKyo.add(tmp);
}
it = setA.iterator();
while(it.hasNext()) {
Object tmp = it.next();
if(!setB.contains(tmp))
setCha.add(tmp);
}
it = setA.iterator();
while(it.hasNext())
setHab.add(it.next());
it = setB.iterator();
while(it.hasNext())
setHab.add(it.next());
System.out.println("A ∩ B = " + setKyo); // 한글 ㄷ을 누르고 한자키
System.out.println("A U B = " + setHab); // 한글 ㄷ을 누르고 한자키
System.out.println("A - B = " + setCha);
}
}
'👩🏻💻 About 프로그래밍 > Java' 카테고리의 다른 글
Java HashMap, TreeMap, hashing, HashMap의 주요 메서드 (0) | 2023.12.07 |
---|---|
Java TreeSet, 이진 탐색 트리(binary seach tree), TreeSet 생성자 · 메서드, 트리 순회(tree traversal) (0) | 2023.12.07 |
Java Comparator와 Comparable (0) | 2023.12.07 |
Java Arrays, 배열의 출력·복사·채우기·정렬·검색 등 (0) | 2023.12.07 |
Java Iterator, ListIterator, Enumration, Map과 Iterator (0) | 2023.12.07 |
블로그의 정보
Hello 춘기's world
볼빵빵오춘기