Set(HashSet, TreeSet, LinkedHashSet)
by 핫도구반응형
Set이란, 원소의 중복을 허용하지 않으며 순서가 없다.
Set에는 HashSet, TreeSet, LinkedHashSet이 존재한다.
1. HashSet
- 해쉬 테이블에 원소를 저장하기 때문에 성능면에서 가장 우수하지만 원소들의 순서가 일정하지 않다는 단점이 존재한다. 즉, index가 존재하지 않는다. 하지만 index가 존재하지 않는다고 해도 반복문을 사용하지 못하는 것이 아니다.(반복문, 반복자 사용 가능)
HashSet<String> sSet = new HashSet<String>();
sSet.add("Java");
sSet.add("MySql");
sSet.add("Web_Servlet");
sSet.add("Web_JSP");
sSet.add("Java"); // 오류는 없지만 허용하지 않음
sSet.add("Spring");
sSet.add("SpringBoot");
System.out.println(sSet); // [Java, Web_JSP, MySql, Web_Servlet, SpringBoot, Spring]
sSet.remove("Spring");// index가 없기 때문에 vale값을 직접 입력해준다.
for (String s: sSet) {
System.out.print(" "+ s + " ");
} // Java Web_JSP MySql Web_Servlet SpringBoot
System.out.println(sSet.size); // 5
// Iterator(반복자) 적용
// 순차적으로 비교하면서 원하는 값을 찾거나 삭제할 수 있음
Iterator<String> iSet = sSet.iterator();
while (iSet.hasNext()) {
if (iSet.next().contains("a")) {
iSet.remove();
}
}
//next()를 반복문 내부에서 2회 이상 사용은 주의, hasNext() 값이 false인 상태에서 접근할 수 있기 때문이다. else if로 처리하는 경우는 가능할 수 있음
// 그래서 아래와 같이 사용할 수 있음
while (iSet.hasNext()) {
String test = iSet.next();
//리터럴에 "-"이 들어가면 next()메서드에서 오류가 발생한다.
if (test.contains("a")) {
iSet.remove();
} if (test.equals("SpringBoot")) {
iSet.remove();
sSet.add("Java");
}
}
// iSet 출력을 위해 재사용하려면 시작점을 처음으로 되돌려야 한다. 왜냐하면 while구문 안에서 hasNext()를 사용했기 때문.
// Iterator에서는 자료를 포인트로 하는 커서가 있고 반복을 마치면 커서는 마지막으로 도달된다.(hasNext()의 값은 무조건 false)
// 때문에 위치를 처음으로 되돌려줘야 한다.
iSet = sSet.iterator();
while(iSet.hasNext()) {
System.out.print(iSet.next() + " ");
}// Java Web_JSP MySql Web_Servlet
// 삭제 후 원본sSet 출력
for (String s: sSet) {
System.out.print(" "+ s + " ");
} // Java Web_JSP MySql Web_Servlet
// 주소참조하기 때문
2. TreeSet
- red - black - tree에 원소를 저장한다.
- 따라서 값에 의해 순서가 결정되지만 HashSet보다는 느리다.
TreeSet<Integer> sSet = new TreeSet<Integer>();
while (lSet.size() != 6) {
int arr = (int) (Math.random() * 44 + 1);
sSet.add(arr);
}
System.out.println("TreeSet을 활용한 sSet => " +sSet); // [15, 26, 29, 35, 36, 44]
또한 자동으로 오름차순으로 정렬한다.
3. LinkedHashSet
- combination of HashTable and LinkedList, 원소들의 순서는 삽입되었던 순서와 같다.
- 또한 입력한 순서대로 값을 나타낸다.
Set<String> linkSet = new LinkedHashSet<String>();
linkSet.add("칼국수");
linkSet.add("장조림");
linkSet.add("짜장면");
linkSet.add("콩국수");
linkSet.add("제육");
System.out.println("LinkedHashSet =>"+linkSet); // [칼국수, 장조림, 짜장면, 콩국수, 제육]
즉, 결론적으로 3가지의 Set은 상황마다 다르게 사용되며 간단하게 표로 표현할 수 있다.

반응형
'JAVA > OLD' 카테고리의 다른 글
| Map(HashMap, TreeMap, LinkedHashMap) (0) | 2024.07.29 |
|---|---|
| 다양한 집합(합집합, 교집합, 차집합, 부분집합) (0) | 2024.07.29 |
| List 인터페이스 (ArrayList & LinkedList) (0) | 2024.07.29 |
| Generic (0) | 2024.07.27 |
| StringBuffer & StringBuilder (0) | 2024.07.27 |
블로그의 정보
AquaMan
핫도구