English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 튜토리얼에서는 예제를 통해 Java LinkedHashSet 클래스와 그 메서드를 배웁니다.
Java 컬렉션 프레임워크의 LinkedHashSet 클래스는 해시 테이블과 링크드 리스트 데이터 구조의 기능을 제공합니다.
를 구현합니다.Set 인터페이스입니다.
LinkedHashSet의 요소는 Set 인터페이스와 유사하게 저장됩니다.HashSet의해시 테이블에.
하지만, 링크드 해시 셋은 내부에서 모든 요소를 위한 더블 링크드 리스트를 유지합니다. 링크드 리스트는 해시 테이블에 요소를 삽입하는 순서를 정의합니다.
링크드 해시 셋을 생성하기 위해 먼저 java.util.LinkedHashSet 패키지를 가져와야 합니다.
패키지를 가져온 후 Java에서 링크드 해시 셋을 생성할 수 있습니다.
//를 가지고 있습니다.8용량과 0.75부하 인덱스의 LinkedHashSet LinkedHashSet<Integer> numbers = new LinkedHashSet<>();8, 0.75);
여기서, numbers라는 이름의 링크드 해시 셋을 생성합니다.
주의할 것은 new LinkedHashSet<>()8, 0.75) 여기서, 첫 번째 매개변수는용량두 번째 매개변수는부하 인덱스입니다.
capacity - 이 해시 셋의 용량은8이는 그것이 저장할 수 있는8요소.
loadFactor- 이 해시 셋의 부하 인덱스는 0입니다.6이는 우리의 해시 테이블이 가득 차면60%,요소는 원래 해시 테이블의 두 배 크기인 새 해시 테이블로 이동합니다。
기본 용량과 부하 요소
용량과 부하 요소를 정의하지 않고 링크드 해시 셋을 생성할 수 있습니다. 예를 들어,
//기본 용량과 부하 요소를 가진 LinkedHashSet LinkedHashSet<Integer> numbers1 = new LinkedHashSet<>();
기본적으로
링크드 해시 셋의 용량은16
부하 요소는 0이 될 것입니다.75
이렇게 다른 셋의 모든 요소를 포함하는 링크드 해시 셋을 생성하는 방법입니다.
import java.util.LinkedHashSet; import java.util.ArrayList; class Main { public static void main(String[] args) { //짝수의 arrayList 생성 ArrayList<Integer> evenNumbers = new ArrayList<>(); evenNumbers.add(2); evenNumbers.add(4); System.out.println("ArrayList: ", + evenNumbers); //ArrayList에서 LinkedHashSet 생성 LinkedHashSet<Integer> numbers = new LinkedHashSet<>(evenNumbers); System.out.println("LinkedHashSet: "); + numbers); } }
출력 결과
ArrayList: [2, 4] LinkedHashSet: [2, 4]
LinkedHashSet 클래스는 링크드 해시 셋에 대한 다양한 작업을 수행할 수 있는 메서드를 제공합니다.
add() - 지정된 요소를 링크드 해시 셋에 삽입
addAll() - 지정된 셋의 모든 요소를 링크드 해시 셋에 삽입
예를 들어
import java.util.LinkedHashSet; class Main { public static void main(String[] args) { LinkedHashSet<Integer> evenNumber = new LinkedHashSet<>(); // add() 메서드 사용 evenNumber.add(2); evenNumber.add(4); evenNumber.add(6); System.out.println("LinkedHashSet: "); + evenNumber); LinkedHashSet<Integer> numbers = new LinkedHashSet<>(); //addAll() 메서드 사용 numbers.addAll(evenNumber); numbers.add(5); System.out.println("New LinkedHashSet: ", + numbers); } }
출력 결과
LinkedHashSet: [2, 4, 6] New LinkedHashSet: [2, 4, 6, 5]
LinkedHashSet의 요소에 접근하려면 iterator() 메서드를 사용할 수 있습니다. 이 메서드를 사용하려면 java.util.Iterator 패키지를 가져와야 합니다. 예를 들어,
import java.util.LinkedHashSet; import java.util.Iterator; class Main { public static void main(String[] args) { LinkedHashSet<Integer> numbers = new LinkedHashSet<>(); numbers.add(2); numbers.add(5); numbers.add(6); System.out.println("LinkedHashSet: "); + numbers); //iterator() 메서드 호출 Iterator<Integer> iterate = numbers.iterator(); System.out.print("Iterator를 사용한 LinkedHashSet: "); //요소 접근 while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } }
출력 결과
LinkedHashSet: [2, 5, 6] Iterator를 사용한 LinkedHashSet: 2, 5, 6,
주의사항:
hasNext()은 링크의 해시 셋에서 다음 요소가 존재하는지 반환합니다
next()은 링크의 해시 셋에서 다음 요소를 반환합니다
remove() - 리스트의 해시 셋에서 지정된 요소를 제거합니다
removeAll() - 리스트의 해시 셋에서 모든 요소를 제거합니다
예를 들어
import java.util.LinkedHashSet; class Main { public static void main(String[] args) { LinkedHashSet<Integer> numbers = new LinkedHashSet<>(); numbers.add(2); numbers.add(5); numbers.add(6); System.out.println("LinkedHashSet: "); + numbers); //remove() 메서드를 사용하여 boolean value1 = numbers.remove(5); System.out.println("5제거되었나? " + value1); boolean value2 = numbers.removeAll(numbers); System.out.println("모든 요소가 제거되었나? "); + value2); } }
출력 결과
LinkedHashSet: [2, 5, 6] 5제거되었나? true 모든 요소가 제거되었나? true
LinkedHashSet 클래스의 다양한 메서드는 다양한 Set 연산을 수행하는 데도 사용될 수 있습니다.
두 집합 간의 합집합을 수행하려면 addAll() 메서드를 사용할 수 있습니다. 예를 들어
import java.util.LinkedHashSet; class Main { public static void main(String[] args) { LinkedHashSet<Integer> evenNumbers = new LinkedHashSet<>(); evenNumbers.add(2); evenNumbers.add(4); System.out.println("LinkedHashSet1: " + evenNumbers); LinkedHashSet<Integer> numbers = new LinkedHashSet<>(); numbers.add(1); numbers.add(3); System.out.println("LinkedHashSet2: " + numbers); //두 집합의 합집합 numbers.addAll(evenNumbers); System.out.println("합집합: "); + numbers); } }
출력 결과
LinkedHashSet1: [2, 4] LinkedHashSet2: [1, 3] 합집합: [1, 3, 2, 4]
두 집합 간의 교집합을 수행하려면 retainAll() 메서드를 사용할 수 있습니다. 예를 들어
import java.util.LinkedHashSet; class Main { public static void main(String[] args) { LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>(); primeNumbers.add(2); primeNumbers.add(3); System.out.println("LinkedHashSet1: " + primeNumbers); LinkedHashSet<Integer> evenNumbers = new LinkedHashSet<>(); evenNumbers.add(2); evenNumbers.add(4); System.out.println("LinkedHashSet2: " + evenNumbers); //집합의 교집합 evenNumbers.retainAll(primeNumbers); System.out.println("집합의 교집합: "); + evenNumbers); } }
출력 결과
LinkedHashSet1: [2, 3] LinkedHashSet2: [2, 4] 집합의 교집합: [2]
두 그룹 간의 차집합을 계산하려면 removeAll() 메서드를 사용할 수 있습니다. 예를 들어,
import java.util.LinkedHashSet; class Main { public static void main(String[] args) { LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>(); primeNumbers.add(2); primeNumbers.add(3); primeNumbers.add(5); System.out.println("LinkedHashSet1: " + primeNumbers); LinkedHashSetoddNumbers = new LinkedHashSet<>(); LinkedHashSet<Integer> oddNumbers = new LinkedHashSet<>();1); LinkedHashSet<Integer> oddNumbers = new LinkedHashSet<>();3); LinkedHashSet<Integer> oddNumbers = new LinkedHashSet<>();5); System.out.println("LinkedHashSet2: " + oddNumbers에 추가합니다 //LinkedHashSet1oddNumbers);2과 LinkedHashSet primeNumbers.removeAll(oddNumbers); System.out.println("차집합: ", + primeNumbers); } }
출력 결과
LinkedHashSet1: [2, 3, 5] LinkedHashSet2: [1, 3, 5] 차집합: [2]
콜렉션에서 하나의 콜렉션이 다른 콜렉션의 부集合인지 확인하려면 containsAll() 메서드를 사용할 수 있습니다. 예를 들어,
import java.util.LinkedHashSet; class Main { public static void main(String[] args) { LinkedHashSet<Integer> numbers = new LinkedHashSet<>(); numbers.add(1); numbers.add(2); numbers.add(3); numbers.add(4); System.out.println("LinkedHashSet1: " + numbers); LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>(); primeNumbers.add(2); primeNumbers.add(3); System.out.println("LinkedHashSet2: " + primeNumbers); //primeNumbers가 numbers의 부集合인지 확인합니다 boolean result = numbers.containsAll(primeNumbers); System.out.println("LinkedHashSet2LinkedHashSet입니다1의 부集合이 맞나요? " + result); } }
출력 결과
LinkedHashSet1: [1, 2, 3, 4] LinkedHashSet2: [2, 3] LinkedHashSet2LinkedHashSet입니다1의 부集合이 맞나요? true
메서드 | 설명 |
---|---|
clone() | LinkedHashSet 복제를 생성합니다 |
contains() | LinkedHashSet에서 지정된 요소를 검색하고 부울 결과를 반환합니다 |
isEmpty() | LinkedHashSet가 비어 있는지 확인합니다 |
size() | LinkedHashSet의 크기를 반환합니다 |
clear() | LinkedHashSet에서 모든 요소를 제거합니다 |
LinkedHashSet와 HashSet은 Set 인터페이스를 구현합니다. 그러나, 그들은 서로 다른 차이점이 있습니다.
LinkedHashSet는 내부에서 링크드 리스트를 유지합니다. 따라서, 요소의 삽입 순서를 유지합니다.
LinkedHashSet 클래스는 HashSet보다 더 많은 저장 공간이 필요합니다. 이는 LinkedHashSet가 내부에서 링크드 리스트를 유지하기 때문입니다.
LinkedHashSet의 성능은 HashSet보다 느립니다. 이는 LinkedHashSet에 쓰레드가 존재하기 때문입니다.
아래는 LinkedHashSet와 TreeSet 간의 주요 차이점입니다:
TreeSet 클래스는 SortedSet 인터페이스를 구현합니다. 이는 TreeSet에 있는 요소가 정렬된 것을 의미합니다. 그러나, LinkedHashSet 클래스는 요소의 삽입 순서만 유지합니다.
TreeSet은 일반적으로 LinkedHashSet보다 느립니다. 이는 TreeSet에 요소를 추가할 때마다 정렬 작업을 수행해야하기 때문입니다.