[Collection] Set_HashSet/TreeSet
🛒 Set 컬렉션
- 요소의 저장 순서를 유지하지 않는다.
-> 요소의 저장 순서를 유지해야 한다면 LinkedHashSet을 이용- 같은 요소의 중복 저장을 허용하지 않는다.
-> 여러개의 null이 존재할 때, 하나의 null값만 저장- 순서가 없으므로 인덱스로 객체를 검색해서 가져오는 get메서드가 존재하지 않는다.
-> 반복자(Iterator)를 사용- List구조에 비해 느리다.
-> 값을 추가/삭제시에 그 값이 있는지 검색 한 뒤 추가/삭제 해주기 때문에- 대표적으로 Set인터페이스의 구현 클래스로 HashSet과 TreeSet이 있다.
🛒 HashSet
1.해시 알고리즘(hash algorithm)을 사용하여 검색 속도가 매우 빠르다.
-> 내부적으로 HashMap 인스턴스를 이용하여 요소를 저장
2. 객체를 저장하기 전 hashCode()메소드를 호출하여 객체의 해시코드를 얻어 내어 저장되어 있는 객체들의 해시 코드와 비교한다. 같은 해시 코드가 있다면 다시 equals() 메서드로 두 객체를 비교해 true가 나오면 동일 객체로 판단하고 저장을 하지 않는다.
🔎 String클래스는 hashCode()와 equals() 메서드를 재정의해서 문자열일 경우 hashCode()의 리턴값을 같게, equals()의 리턴 값을 true가 나오도록
🛒 HashSet 선언
HashSet<Integer> set1 = new HashSet<Integer>();//HashSet생성
HashSet<Integer> set2 = new HashSet<>();//new에서 타입 파라미터 생략가능
HashSet<Integer> set3 = new HashSet<Integer>(set1);//set1의 모든 값을 가진 HashSet생성
HashSet<Integer> set4 = new HashSet<Integer>(10);//초기 용량(capacity)지정
HashSet<Integer> set5 = new HashSet<Integer>(10, 0.7f);//초기 capacity,load factor지정
HashSet<Integer> set6 = new HashSet<Integer>(Arrays.asList(1,2,3));//초기값 지정
- HashSet을 기본으로 생성했을때에는 initial capacity(16), load factor(0.75)의 값을 가진 HashSet객체가 생성된다.
-> 저장된 element의 수 == 저장용량 * load factor- HashSet도 저장공간보다 값이 추가로 들어오면 List처럼 저장공간을 늘리는데, Set은 한 칸씩 저장공간을 늘리지 않고 저장용량을 약 두배로 늘린다.
-> 과부하가 많이 발생한다. 그렇기에 초기에 저장할 데이터 갯수를 알고 있다면 Set의 초기용량을 지정해주는 것이 좋다.
🛒 HashSet 값 추가/삭제
HashSet<Integer> set = new HashSet<Integer>();//HashSet생성
set.add(1); //값 추가
set.add(2);
System.out.println(set.size());//set 크기 : 2
set.remove(1);//값 1 제거
set.clear();//모든 값 제거
🛒 HashSet 값 출력
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3));//HashSet생성
System.out.println(set); //전체출력 [1,2,3]
Iterator iter = set.iterator(); // 반복자(Iterator) 사용
while(iter.hasNext()) {//다음 객체가 있으면 true 없으면 false
System.out.println(iter.next());
}
🛒 HashSet 값 검색
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3));//HashSet생성
System.out.println(set.contains(1)); //set내부에 값 1이 있는지 true
🛒 TreeSet
- 이진 탐색 트리 구조로 추가/삭제에 시간이 걸리지만 정렬/검색에 높은 성능을 보인다.
->Comparator객체를 입력하여 정렬 방법을 임의로 지정가능
🛒 TreeSet 선언
TreeSet<Integer> set1 = new TreeSet<Integer>();//TreeSet생성
TreeSet<Integer> set2 = new TreeSet<>();//new에서 타입 파라미터 생략가능
TreeSet<Integer> set3 = new TreeSet<Integer>(set1);//set1의 모든 값을 가진 TreeSet생성
TreeSet<Integer> set4 = new TreeSet<Integer>(Arrays.asList(1,2,3));//초기값 지정
- HashSet과는 다르게 선언 시 크기를 지정해 줄 수 없다.
🛒 TreeSet 값 추가/삭제
TreeSet<Integer> set = new TreeSet<Integer>();//TreeSet생성
set.add(1); //값추가
set.add(2);
set.add(3);
System.out.println(set.size());//크기 : 3
set.remove(1);//값 1 제거
set.clear();//모든 값 제거
🛒 TreeSet 값 출력
TreeSet<Integer> set = new TreeSet<Integer>(Arrays.asList(4,2,3));//초기값 지정
System.out.println(set); //전체출력 [2,3,4]
System.out.println(set.first());//최소값 출력
System.out.println(set.last());//최대값 출력
System.out.println(set.higher(3));//입력값보다 큰 데이터중 최소값 출력 없으면 null
System.out.println(set.lower(3));//입력값보다 작은 데이터중 최대값 출력 없으면 null
Iterator iter = set.iterator(); // 반복자(Iterator) 사용
while(iter.hasNext()) {//값이 있으면 true 없으면 false
System.out.println(iter.next());
}
🛒 TreeSet 값 검색
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3));//HashSet생성
System.out.println(set.contains(1)); //set내부에 값 1이 있는지 true
🛒Set 인터페이스 메소드
Set 인터페이스는 Collection 인터페이스를 상속받으므로, Collection 인터페이스에서 정의한 메소드 모두 사용 가능
메서드 | 설명 |
---|---|
boolean add(E e) | 해당 집합(set)에 전달된 요소를 추가 |
void clear() | 모든 요소를 제거 |
boolean contains(Object o) | 전달된 객체를 포함하고 있는지를 확인함 |
boolean equals(Object o) | 전달된 객체가 같은지를 확인 |
boolean isEmpty() | 집합이 비어있는지를 확인 |
Iterator iterator() | 반복자(iterator)를 반환 |
boolean remove(Object o) | 전달된 객체를 제거 |
int size() | 요소의 총 개수를 반환 |
Object[] toArray() | 모든 요소를 Object 타입의 배열로 반환 |
Author And Source
이 문제에 관하여([Collection] Set_HashSet/TreeSet), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ehddek/컬렉션-Set저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)