List나 Map에 비해 문법이 까다롭고 어려운 편
Set계열 주요 메서드
1. HashSet
Hash를 사용하여 속도가 가장빠름
단, 중복 저장을 하지 못함
HashMap을 더 많이 사용함
2.LinkedHashSet
HashSet과 비슷하지만
Set에 순서를 추가해 유지함
3.Treeset
정렬을 유지하며 Set중 가장 많이 씀
반복자 패턴을 사용하기 위한 인터페이스 (잘 안씀)
1.Enumeration : Iterator 구버전
2.Iterator
3.ListIterator : Iterator를 상속받아 양방향 특징
List때 사용한 Member 클래스를 그대로 사용해 테스트
package com.multi.ex03.collections_set;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class SetBasic {
// TreeSet : 중복된 데이터를 허용하지 않고, 데이터가 정렬됨 ★★★
// -> Comparable을 사용하여 정렬, 중복도 제거
// LinkedHashSet : Hash코드 기준으로 중복을 제거, 들어온 순서가 보존
// -> hashCode()을 사용함
// HashSet : Hash코드 기준으로 중복을 제거, 아무 순서도 보장되지 않음 -> 제일빠르다. ★
// -> hashCode()을 사용함
public static void main(String[] args) {
// Set<String> set = new HashSet<>(); // [박길동, 김길동, 홍길동] 순서 유지되지 않는다. 중복 제거됨!
// Set<String> set = new TreeSet<>(); // [김길동, 박길동, 홍길동] 오름차순으로 정렬된다. 중복 제거됨!
Set<String> set = new LinkedHashSet<>(); // [홍길동, 박길동, 김길동] 입력순으로 저장됨, 중복 제거됨!
set.add("홍길동");
set.add("박길동");
set.add("김길동");
set.add("홍길동");
System.out.println(set);
// set을 순회하는 방법
// 1. 반복문 -> index는 안된다!
for(String str : set) {
System.out.println(str);
}
// 2. List로 변경해서 순회가능!
List<String> strList = new ArrayList<>(set);
System.out.println(strList);
// 여기까지가 가장 기본적인 문법
// 객체를 통해 set을 다루는 방법 -> 이 부분이 까다롭다.
// -> 객체를 개조해야 사용 가능하다.
Set<Member2> treeSet = new TreeSet<>();
Set<Member2> hashSet = new HashSet<>();
Set<Member2> linkedHashSet = new LinkedHashSet<>();
List<Member2> list = new ArrayList<>();
list.add(new Member2("testID1", "김길동1", 21, 10000.123));
list.add(new Member2("testID1", "김길동1", 21, 10000.123)); // 완전동일
list.add(new Member2("testID3", "김길동3", 23, 444000.123));
list.add(new Member2("testID2", "홍길동3", 41, 3300.123)); // ID 만 다름
list.add(new Member2("testID2", "김길동2", 22, 10000.123));
// 1. set 데이터 추가 하기
treeSet.addAll(list); // 컬렉션으로 초기화하는 방법
for(Member2 m : list) { // 반복문 활용
hashSet.add(m);
}
list.forEach((m)->linkedHashSet.add(m)); // 람다식 활용
System.out.println(treeSet.size()); // 3 -> ID기준으로 필터링
System.out.println(hashSet.size()); // 4 -> hashcode 기준으로 필터링, 일치하는 데이터만 중복제거
System.out.println(linkedHashSet.size()); // 4 -> hashcode 기준으로 필터링, 일치하는 데이터만 중복제거
// 2. 순회하는 방법
// 1) for문으로 순회
System.out.println("treeSet 순회");
for(Member2 m : treeSet) {
System.out.println(m);
}
System.out.println("----------------------------------------");
// 2) Iterator(반복자) 활용, 전통적인 방법 ★★
System.out.println("hashSet 순회");
Iterator<Member2> iter = hashSet.iterator();
while(iter.hasNext()) { // hasNext : 다음 값이 있는 경우에만 true
Member2 m = iter.next(); //next : 다음 데이터값을 가져오는 메소드, 한번만 가져와야한다.
System.out.println(m);
}
System.out.println("----------------------------------------");
// 3) 람다식 순회
System.out.println("linkedHashSet 순회");
linkedHashSet.forEach((m) -> System.out.println(m));
System.out.println("----------------------------------------");
// equals 실험
// 객체에 equals가 구현되지 않은 경우 객체 고유주소로 확인함으로 객체 내용은 달라도 주소가 달라 같지 않다고 나옴
// 객체 단위로 값을 비교하기 위해선 equals를 자동완성하여 구현 필요.
Member2 m1 = new Member2("testID1", "김길동1", 21, 10000.123);
Member2 m2 = new Member2("testID1", "김길동1", 21, 10000.123);
if(m1.equals(m2)) {
System.out.println("같다!");
}else {
System.out.println("틀리다!");
}
System.out.println("---------------------------------------------");
// 객체가 있는지 확인하는 방법
System.out.println(treeSet.contains(m1));
m1.setId("test333");
System.out.println(treeSet.contains(m1));
// 객체 단위로 삭제하는 방법
System.out.println(treeSet.remove(m2));
}
}
'자바' 카테고리의 다른 글
[Java] JDBC (Java DataBase Connectivity) (0) | 2023.11.29 |
---|---|
[Java] I/O 입출력 (0) | 2023.11.23 |
[Java] Collections - Map (0) | 2023.11.23 |
[Java] Collections - List (0) | 2023.11.22 |
[JAVA] Collections - 컬렉션 (0) | 2023.11.22 |