>  기사  >  Java  >  Java에서 HashMap, Hashtable 및 HashSet의 차이점

Java에서 HashMap, Hashtable 및 HashSet의 차이점

高洛峰
高洛峰원래의
2017-01-19 10:26:531743검색

Hashtable 클래스
Hashtable은 Map 인터페이스를 상속하고 키-값 매핑의 해시 테이블을 구현합니다. null이 아닌 모든 객체는 키나 값으로 사용될 수 있습니다.

데이터를 추가하려면 put(key,value)을 사용하고, 데이터를 제거하려면 get(key)을 사용하세요. 이 두 가지 기본 작업의 시간 비용은 일정합니다. ​

해시테이블은 초기 용량과 부하율이라는 두 가지 매개변수를 통해 성능을 조정합니다. 일반적으로 기본 부하 계수 0.75는 시간과 공간의 균형을 더 잘 유지합니다. 로드 비율을 늘리면 공간을 절약할 수 있지만 해당 검색 시간이 늘어나 가져오기 및 넣기와 같은 작업에 영향을 미칩니다.

Hashtable을 사용하는 간단한 예는 다음과 같습니다. 1, 2, 3을 Hashtable에 넣고 키는 각각 "one", "two", "3"입니다.
Hashtable 번호 = new Hashtable( );
numbers.put(“one”, new Integer(1));
numbers.put(“two”, new Integer(2)); ”, new Integer(3));

2와 같은 숫자를 검색하려면 해당 키를 사용하세요.

Integer n = (Integer)numbers.get(“two”); System.out.println(“two = ” + n);

키인 객체는 해시 함수를 계산하여 해당 값의 위치를 ​​결정하므로 키인 모든 객체는 hashCode를 구현해야 합니다. 방법. hashCode 및 equals 메소드는 루트 클래스 Object에서 상속됩니다. 사용자 정의 클래스를 키로 사용하는 경우 두 객체가 동일한 경우, 즉 obj1.equals( obj2)=true인 경우 해당 hashCode는 동일해야 하지만 두 개체가 서로 다른 경우에는 hashCode가 반드시 다른 것은 아닙니다. 두 개체의 hashCode가 동일하면 이러한 현상을 충돌이 발생합니다. 해시 테이블 작업에 소요되는 시간 오버헤드가 증가하므로 해시 테이블 작업 속도를 높이기 위해 잘 정의된 hashCode() 메서드를 정의해 보십시오.

동일한 객체에 다른 hashCode가 있는 경우 해시 테이블 작업에서 예상치 못한 결과가 발생합니다(예상된 get 메서드가 null을 반환함). 이 문제를 방지하려면 한 가지만 기억하면 됩니다. 즉, 동시에 복사합니다. time은 메소드와 hashCode 메소드 중 하나만 작성하는 대신에 동일합니다. 해시테이블은 동기식입니다.

HashMap 클래스
HashMap은 HashMap이 비동기식이며 null, 즉 null 값과 null 키를 허용한다는 점을 제외하면 Hashtable과 유사합니다. 그러나 HashMap을 컬렉션으로 처리할 때(values() 메서드는 컬렉션을 반환할 수 있음) 반복 하위 작업의 시간 오버헤드는 HashMap의 용량에 비례합니다. 따라서 반복 연산의 성능이 매우 중요하다면 HashMap의 초기 용량을 너무 높게 설정하거나 부하율을 너무 낮게 설정하지 마십시오.

WeakHashMap 클래스
WeakHashMap은 키에 대한 "약한 참조"를 구현하는 향상된 HashMap입니다. 키가 더 이상 외부에서 참조되지 않으면 해당 키는 GC에서 재활용될 수 있습니다.

HashSet은 Set 설명을 참조하세요.

Set은 반복되는 요소를 포함하지 않는 컬렉션입니다. 즉, e1과 e2의 두 요소는 e1.equals(e2)=false를 갖고, Set은 대부분 null 요소가 있습니다.


Set의 생성자에는 전달된 Collection 매개변수가 중복 요소를 포함할 수 없다는 제약 조건이 있습니다. ​

참고: 변경 가능한 객체는 주의해서 다루어야 합니다. Set의 변경 가능한 요소가 상태를 변경하여 Object.equals(Object)=true가 되면 몇 가지 문제가 발생합니다.

두 가지 일반적인 Set 구현은 HashSet과 TreeSet입니다. 어느 것을 사용할지 결정하는 것은 매우 간단합니다. HashSet은 훨씬 빠르지만(대부분의 작업에서 로그 시간에 비해 일정한 시간) 순서를 보장하지 않습니다. SortedSet에서 작업을 사용해야 하거나 순차적 반복이 중요한 경우 TreeSet을 사용하세요. 그렇지 않으면 HashSet을 사용하십시오. 대부분의 경우 HashSet을 사용하지 않는 것은 공정한 도박입니다.​​  

HashSet에 대해 명심해야 할 한 가지는 항목 수와 용량의 합 측면에서 반복이 선형이라는 것입니다. 따라서 반복 성능이 중요하다면 적절한 초기 용량을 신중하게 선택해야 합니다. 너무 큰 용량을 선택하면 공간과 시간이 모두 낭비됩니다. 기본 초기 용량은 101이며 일반적으로 필요한 것보다 많습니다. 초기 용량은 int 생성자를 사용하여 지정할 수 있습니다. 할당될 HashSet의 초기 용량은 17입니다.

Set s= new HashSet(17);

HashSet에는 로드 계수라는 "조정 매개변수"도 있습니다. HashSet의 공간 사용량이 매우 염려된다면 HashSet 텍스트에서 자세한 내용을 읽어보세요. 그렇지 않으면 기본값을 사용하면 됩니다. 기본 부하 계수를 수락하지만 초기 용량을 지정하려는 경우 세트가 증가할 것으로 예상되는 용량의 약 두 배에 해당하는 숫자를 선택하십시오. 당신의 추측이 근거에서 벗어난다면, 그 규모가 커질 수도 있고 약간의 공간만 낭비할 수도 있습니다. 그러나 큰 문제는 없습니다. 올바른 크기에 가장 적합한 값을 알고 있으면 이를 사용하고, 모르면 이전 값을 사용하거나 짝수 값을 사용하십시오. 실제로는 별로 중요하지 않습니다. 이러한 것들은 HashSet을 약간 더 좋게 만들 뿐입니다.                                 

TreeSet에는 조정 매개변수가 없습니다. 복제 외에도 HashSet 및 TreeSet에는 해당 인터페이스(Set 및 TreeSet)에 필요한 작업만 있고 다른 작업은 없습니다.


Java의 HashMap, Hashtable 및 HashSet의 차이점과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트에 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.