JavaRush /Java Blog /Random-KO /자바의 HashSet
渚古河
레벨 30
Москва

자바의 HashSet

Random-KO 그룹에 게시되었습니다
클래스는 HashSet인터페이스를 구현 Set하고 해시 테이블을 기반으로 하며 인스턴스에 의해 지원됩니다 HashMap. 요소의 순서가 지정되어 있지 않으므로 HashSet일정 시간이 지난 후에도 요소의 순서가 동일할 것이라는 보장은 없습니다. 추가, 삭제 및 검색 작업은 해시 함수가 나중에 설명할 "버킷"에 요소를 올바르게 배포하는 경우 일정한 시간에 수행됩니다. Java의 HashSet - 1다음에 대한 몇 가지 중요한 사항 HashSet:
  • 왜냐하면 클래스는 인터페이스를 구현하며 Set고유한 값만 저장할 수 있습니다.
  • NULL 값을 저장할 수 있습니다.
  • 요소가 추가되는 순서는 해시 코드를 사용하여 계산됩니다.
  • HashSet또한 Serializable및 을 구현합니다 Cloneable.
작업 실행 시간을 일정하게 유지하려면 작업에 소요되는 시간은 요소 수 + 내장 인스턴스의 "용량" ("바구니 수") HashSet에 정비례해야 합니다 . 따라서 성능을 유지하기 위해서는 초기 용량을 너무 높게(혹은 부하율을 너무 낮게) 설정하지 않는 것이 중요합니다. 초기 용량 – 해시 테이블의 초기 셀 수(“빈”)입니다. 모든 셀이 채워지면 셀 수가 자동으로 늘어납니다. 부하율은 용량이 자동으로 증가하기 전에 얼마나 가득 찰 수 있는지를 측정한 것입니다. in의 요소 개수가 초기 용량과 부하율의 곱보다 많아지면 해시 테이블을 다시 해시(요소의 해시 코드를 다시 계산하고 얻은 값에 따라 테이블을 다시 작성)하고 그 안에 있는 세포의 수는 두 배가 됩니다. 로드 팩터 = 테이블에 저장된 요소 수 / 해시 테이블 크기 예를 들어 테이블의 초기 셀 수가 16이고 로드 팩터가 0.75라면 채워진 셀의 수가 12에 도달하면 셀 수가 자동으로 증가합니다. 부하율과 초기 용량은 의 성능에 영향을 미치는 두 가지 주요 요소입니다 . 0.75의 로드 팩터는 평균적으로 좋은 성능을 제공합니다. 이 매개변수가 증가하면 메모리 로드는 감소하지만(재해시 및 재구축 횟수가 감소하므로) 추가 및 조회 작업에 영향을 미칩니다. 재해싱에 소요되는 시간을 최소화하려면 올바른 초기 용량 매개변수를 선택해야 합니다. 초기 용량이 최대 요소 수를 로드 비율로 나눈 값보다 크면 재해싱 작업이 전혀 발생하지 않습니다. HashSetHashMapHashSetHashSetHashSet중요한: 은 HashSet동기화가 내장된 데이터 구조가 아니므로 여러 스레드가 동시에 작업하고 있고 그 중 적어도 하나가 변경을 시도하는 경우 외부에서 동기화된 액세스를 제공해야 합니다. 이는 종종 HashSet. 그러한 객체가 없으면 Collections.synchronizedSet(). 이는 현재 HashSet.
Set s = Collections.synchronizedSet(new HashSet(...));
HashSet 생성자:
  1. HashSet h = new HashSet(); - 기본 생성자. 기본 초기 용량은 16이고 부하율은 0.75입니다.
  2. HashSet h = new HashSet(int initialCapacity)– 주어진 초기 용량을 가진 생성자. 부하율 – 0.75.
  3. HashSet h = new HashSet(int initialCapacity, float loadFactor);— 주어진 초기 용량과 부하 계수를 갖는 생성자.
  4. HashSet h = new HashSet(Collection C)– 다른 컬렉션의 요소를 추가하는 생성자.
아래 코드는 몇 가지 방법을 보여줍니다 HashSet.
import java.util.*;

class Test
{
    public static void main(String[]args)
    {
        HashSet<String> h = new HashSet<String>();

        // Add elements to the HashSet using the add() method
        h.add("India");
        h.add("Australia");
        h.add("South Africa");
        h.add("India");// try to add another same element

        // Print the elements of the HashSet to the console
        System.out.println(h);
        System.out.println("List contains India or not:" +
                           h.contains("India"));

        // Remove elements from the set using the remove() method
        h.remove("Australia");
        System.out.println("List after removing Australia:"+h);

        // Loop through the elements of the HashSet using an iterator:
        System.out.println("Iterating over list:");
        Iterator<String> i = h.iterator();
        while (i.hasNext())
            System.out.println(i.next());
    }
}
결론:
[South Africa, Australia, India]
List contains India or not:true
List after removing Australia:[South Africa, India]
Iterating over list:
South Africa
India
인터페이스를 구현하는 모든 클래스는 Set구현에 의해 내부적으로 지원됩니다 Map. HashSet를 사용하여 요소를 저장합니다 HashMap. HashMap요소를 추가하려면 요소를 키-값 쌍으로 표현해야 하지만 HashSet값만 추가됩니다. 실제로 우리가 전달하는 값은 HashSet객체의 키 HashMap이며 상수가 값으로 사용됩니다 HashMap. 이렇게 하면 모든 키-값 쌍에서 모든 키가 동일한 값을 갖게 됩니다. 구현 HashSet위치 java doc:
private transient HashMap map;

// Constructor - 1
// All constructors implicitly create a HashMap object.
public HashSet()
{
    // Create an implicit HashMap object
    map = new HashMap();
}

// Constructor- 2
public HashSet(int initialCapacity)
{
    // Create an implicit HashMap object
    map = new HashMap(initialCapacity);
}

// An object of the Object class, each time acting as a value in the HashMap
private static final Object PRESENT = new Object();
add()y 메소드를 살펴보면 다음과 같습니다 HashSet.
public boolean add(E e)
{
   return map.put(e, PRESENT) == null;
}
add()y 메소드가 내부 객체의 HashSet메소드를 호출하여 추가할 요소를 키로 전달하고 PRESENT 상수를 값으로 전달하는 것을 볼 수 있습니다. 이 방법은 비슷한 방식으로 작동합니다 . 내부 객체 메소드를 호출합니다 . put()HashMapremove()remove()HashMap
public boolean remove(Object o)
{
  return map.remove(o) == PRESENT;
}
HashSet해시 테이블을 기반으로 하며 추가, 삭제 또는 조회 작업은 평균적으로 일정한 (O(1)) 시간 내에 완료됩니다 . 방법 HashSet:
  1. boolean add(E e)HashSet: 요소 가 없으면 에 요소를 추가 하지만 해당 요소가 이미 존재하는 경우 메서드는 false 를 반환합니다 .
  2. void clear():세트에서 모든 요소를 ​​제거합니다.
  3. boolean contains(Object o): 주어진 요소가 세트에 존재하면 true를 반환합니다.
  4. boolean remove(Object o): 해당 요소가 있으면 세트에서 해당 요소를 제거합니다.
  5. Iterator iterator(): 집합의 요소에 대한 반복자를 반환합니다.
  6. boolean isEmpty(): 집합에 요소가 없으면 true를 반환합니다.
  7. Object clone(): 표면 복제를 수행합니다 HashSet.
Javadoc: https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION