HashSet은 Set 인터페이스
의 구현 클래스이다.
Set은 객체를 중복해서 저장할 수 없고 하나의 Null 값만 저장할 수 있다.
Set 인터페이스를 구현한 클래스로는 HashSet과 TreeSet이 있는데, TreeSet의 경우 HashSet과는 달리 자동정렬 해준다는 차이점이 있다.
Set은 주머니 형태이다. 비선형 구조이기에 저장 순서가 없으며 인덱스도 존재하지 않는다.
그래서 값을 추가하거나 삭제할 때 내가 추가 혹은 삭제하고자 하는 값이 Set 내부에 있는지 검색한 뒤 추가나 삭제를 해야한다. 속도가 List 구조에 비해 느리다.
HashSet<Integer> set1 = new HashSet<Integer>(); //HashSet 생성
HashSet<Integer> set1 = new HashSet<Integer>(); //타입 생략 가능
HashSet<Integer> set2 = new HashSet<Integer>(set1); //set1의 모든 값을 가진 HashSet 생성
HashSet<Integer> set3 = new HashSet<Integer>(Arrays.asList(1, 2, 3, 4, 5,)); //초기값 지정
HashSet<Integer> set = new HashSet<>();
set.add(1); //값 추가
set.remove(1); //값이 1인 요소 제거
set.add(2);
set.add(3);
set.add(4);
set.clear(); //모든 값 제거
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(2, 4, 6, 8, 10));
System.out.println(set.size()); //5
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1, 3, 5, 7, 9,));
System.out.println(set.isEmpty()); //false
HashSet<Integer> set2 = new HashSet<Integer>();
set2.add(1);
set2.remove(1);
System.out.println(set2.isEmpty()); //true
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1, 2, 3, 4, 5));
System.out.println(set.contains(3)); //true
System.out.println(set.contains(6)); //false
Set 컬렉션을 그냥 출력할 경우 set의 전체값이 출력된다.
Set은 배열이나 list처럼 인덱스로 객체를 가져오는 get(index)
메소드가 없기 때문에, 객체 전체를 대상으로 한번씩 반복해서 가져오는 Iterator
를 사용해야 한다.
(Iterator도 따로 import해주어야 한다.)
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(2, 4, 6, 8, 10));
System.out.println(set); //[2, 4, 6, 8, 10]
Iterator iter = set.iterator();
while(iter.hasNext()) { //다음 값이 존재하면 반복
System.out.print(iter.next() + " "); //2 4 6 8 10
}
retainAll()
메소드 사용 HashSet a = new HashSet(Arrays.asList(1, 2, 3, 4, 5));
HashSet b = new HashSet(Arrays.asList(2, 4, 6, 8, 10));
a.retainAll(b);
System.out.println("교집합: " + a); //[2, 4] 출력
addAll()
메소드 사용HashSet a = new HashSet(Arrays.asList(1, 2, 3, 4, 5));
HashSet b = new HashSet(Arrays.asList(2, 4, 6, 8, 10));
a.addAll(b);
System.out.println("합집합: " + a); //[2, 4, 6, 8, 10] 출력
removeAll()
메소드 사용HashSet a = new HashSet(Arrays.asList(1, 2, 3, 4, 5));
HashSet b = new HashSet(Arrays.asList(2, 4, 6, 8, 10));
a.removeAll(b);
System.out.println("차집합: " + a); //[1, 3, 5] 출력
여집합은 전체집합 중 A의 원소가 아닌 것들의 집합이다.
containsAll()
메소드 사용HashSet a = new HashSet(Arrays.asList(1, 2, 3, 4, 5));
HashSet b = new HashSet(Arrays.asList(2, 4));
HashSet c = new HashSet(Arrays.asList(1, 7));
System.out.println(a.containsAll(b)); //true 출력
System.out.println(a.containsAll(c)); //false 출력
List<Integer> list = new ArrayList<>();
Set<Integer> set = new HashSet<>(list); // list -> set
List<Integer> list = new ArrayList<>(set); // set -> list