ArrayList는 데이터 간의 순서가 존재합니다. 만약 순서에 상관없이 데이터만 저장하고 싶은 경우는 어떻게 할까요? Set(집합)자료구조를 사용하면 됩니다.
수학적으로 집합은 중복한 데이터를 가질 수 없습니다. Set 인터페이스는 Collection 인터페이스에 정의된 메소드를 제공하지만, 중복만을 막도록 설계되어 있습니다.
HashSet
해쉬테이블에 원소를 저장합니다. 때문에 성능면에서 가장 뛰어납니다. but 원소들의 순서가 일정하지 않은 단점도 있습니다.
TreeSet
레드-블랙 트리(red-block tree)에 원소를 저장합니다. 값에 따라 순서가 결정됩니다.
1, 2, 3, … / a,b,c, … / 가,나,다,… 순서 입니다.
LinkedHashSet
LinkedList(연결 리스트)와 해쉬 테이블을 결합한 것입니다. 삽입되었던 순서로 원소가 저장됩니다.
예제) 다 써보기
public class SetTest { public static void main(String[] args) { HashSet<String> set = new HashSet<>(); // 순서가 일정하지 않다 // LinkedHashSet<String> set = new LinkedHashSet<>(); // 입력 순서 // TreeSet<String> set = new TreeSet<>(); // 알파벳 순서 set.add("Milk"); set.add("Bread"); set.add("Butter"); set.add("Cheese"); set.add("Ham"); set.add("Tomato"); System.out.println(set); if (set.contains("Tomato")) { // contain() : 데이터가 있는지 없는지 여부를 반환 System.out.println("토마토 포함돼 있음"); } } }



👆HashSet()는 순서가 엉망이지만 가장 성능이 우수합니다
예제2) 중복된 단어 검출하기
집합은 앞서 말했지만 중복을 허용하지 않습니다. 이것을 이용하여 전체 문장에서 중복된 단어를 검출하는 프로그램입니다.
import java.util.HashSet; import java.util.Set; public class FindDupplication { public static void main(String[] args) { Set<String> s = new HashSet<>(); String[] sample = { "사과", "사과", "바나나", "토마토"}; for (String a : sample) if (!s.add(a)) System.out.println("중복된 단어 : " + a); System.out.println("s의 크기 : " + s.size()); System.out.println("중복되지 않은 단어 : " + s); } }

TMI
Set을 이용하면 로또 게임도 만들기 편하다
import java.util.*; public class StreamEx01 { public static void main(String[] args) { //HashMap<String, Objects> data = new HashMap<>(); Set<Integer> lotto = new HashSet<>(); Random r = new Random(); while (true){ int num = r.nextInt(45)+1; lotto.add(num); if(lotto.size()==6) break; } lotto.stream().forEach(i -> System.out.print(i+" ")); } }

Share article