List 는 같은 값을 여러 번 저장할 수 있습니다. Set 은 같은 값을 저장할 수 없습니다.
List : [철수, 영희, 철수, 민준] → 철수가 두 번 들어가도 됨 Set : [철수, 영희, 민준] → 철수를 두 번 넣으면 한 번만 저장됨
Collection (인터페이스) | ├── List (인터페이스) │ ├── ArrayList │ ├── LinkedList │ ├── Vector │ └── ... │ ├── Set (인터페이스) │ ├── HashSet │ ├── LinkedHashSet │ ├── TreeSet │ └── ...
Set 의 세 가지 특징
- 중복 불허 : 같은 값은 한 번만 저장됩니다
- 순서 없음 : 넣은 순서가 보장되지 않습니다
- 가변 크기 : 추가/삭제 시 크기가 자동으로 변합니다
중복을 자동으로 제거하고 싶을 때 Set 이 딱입니다.
사용자 아이디 목록 → 아이디는 중복 불가
로또 번호 6개 뽑기 → 같은 번호 중복 불가
방문한 페이지 기록 → 같은 페이지 중복 제거
값을 저장할 위치를 계산으로 결정하는 자료구조입니다.
package collection.set;
import java.util.HashSet;
import java.util.Set;
public class SetEx {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
// 추가
set.add("철수");
set.add("영희");
set.add("철수"); // 중복! 무시 됨
System.out.println(set);
System.out.println(set.size());
// 포함 여부
System.out.println(set.contains("철수"));
System.out.println(set.contains("민준"));
// set.contains("철수"); // true
// set.contains("민준"); // false
// 삭제
set.remove("철수");
// 전체 순회
for (String name : set) {
System.out.println(name);
}
} // end of main
} // end of class
package collection.set;
import java.util.*;
public class LottoGame {
public static void main(String[] args) {
Set<Integer> lotto = new HashSet<>();
Random random = new Random();
// 6개가 될 때까지 계속 추가
while (lotto.size() < 6) {
int number = random.nextInt(45) + 1; // 1 ~ 45
lotto.add(number);
}
System.out.println("이번 주 로또 번호 : " + lotto);
System.out.println("총 " + lotto.size() + "개");
// 로또 번호를 오름 차순으로 정렬하시오.
// 힌트 - 배열이나 List 계열은 순서가 있음.
// ArrayList 생성자 안에 set 계열을 넣으면 자동으로 ArrayList 객체를 생성해 준다.
List<Integer> sortedLotto = new ArrayList<>(lotto);
// 오름 차순 정렬
Collections.sort(sortedLotto);
System.out.println("오름 차순 로또 번호 : " + sortedLotto);
}
}
List sortedLotto = new ArrayList<>(lotto); 이렇게 하면
arrylist 안에 hashset자체가 들어가는게 아니라 요소만 들어간다.
import java.util.*;
public class Main {
public static void main(String[] args) {
// 1. 빈 리스트 생성
ArrayList<String> a1 = new ArrayList<>();
// 2. 초기 용량 지정
ArrayList<String> a2 = new ArrayList<>(5);
// 3. 다른 컬렉션 넣기
Set<String> set = new HashSet<>();
set.add("사과");
set.add("바나나");
ArrayList<String> a3 = new ArrayList<>(set);
System.out.println(a1); // []
System.out.println(a2); // []
System.out.println(a3); // [사과, 바나나] 순서는 set 특성상 달라질 수 있음
}
}
이렇게 보면 array list 안에는 크기를 지정할수도 있고 이렇게 다른 객체를 넣어서
new ArrayList<>(list)
new ArrayList<>(set)
new ArrayList<>(vector)
그래서
Set<String> set = new HashSet<>();
set.add("A");
set.add("B");
List<String> list = new ArrayList<>(set);
System.out.println(list);
이렇게 통째로 출력하거나
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
get으로도 출력할수있다