언제 또는 왜 Dictionary 또는 HashTable을 사용해야하는지 파악하려고합니다. 나는 여기에서 약간의 검색을 수행했으며 사람들이 내가 완전히 동의 한 사전의 일반적인 장점에 대해 이야기하는 것을 발견했습니다.
그러나 나는 또한 사전이 객체가 삽입 된 순서대로 정렬되지 않는 것을 반환하지는 않는다는 것을 읽었습니다. 해시 테이블의 위치 내가 이해하는 것처럼 이것은 일부 상황에서 HashTable이 훨씬 빠릅니다.
내 질문은, 그 상황이 무엇일까요? 위의 가정에서 내가 틀렸습니까? 어떤 상황을 다른 것보다 먼저 선택할 수 있습니까 (예 : 마지막 상황은 약간 모호합니다).
답변
System.Collections.Generic.Dictionary<TKey, TValue>
및 System.Collections.Hashtable
클래스 내부적 해시 테이블의 데이터 구조를 유지한다. 그들 중 어느 것도 품목의 주문 보존을 보장하지 않습니다.
대부분의 경우 권투 / 박싱 해제 문제를 남겨두고도 비슷한 성능을 가져야합니다.
그들 사이의 차 구조 차이 즉 Dictionary
의존 체인 반면 해결 충돌 (각 해시 테이블 버킷 아이템리스트 유지) Hashtable
용도 다시 해싱 (충돌이 발생하는 경우, 버킷에 키를 매핑하는 다른 해시 함수를 시도) 충돌 해상도를 .
Hashtable
.NET Framework 2.0 이상을 대상으로하는 경우 클래스 를 사용 하면 이점이 거의 없습니다 . 에 의해 효과적으로 사용되지 않습니다 Dictionary<TKey, TValue>
.
답변
나는 그것이 당신에게 아무 의미가 없다고 생각합니다. 하지만 들르는 사람들을 위해서만
성능 테스트-SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable
메모리 할당 :
삽입 시간 :
아이템 검색 시간 :
답변
해시 테이블과 사전의 차이점
사전:
- 존재하지 않는 키를 찾으려면 사전에서 오류를 반환합니다.
- 권투 및 언 박싱이 없기 때문에 해시 테이블보다 빠른 사전.
- 사전은 일반적인 유형이므로 모든 데이터 유형에 사용할 수 있습니다.
해시 테이블 :
- 존재하지 않는 키를 찾으려면 Hashtable이 null을 반환합니다.
- 박싱과 언 박싱이 필요하기 때문에 사전보다 해시 테이블이 느립니다.
- 해시 테이블은 일반적인 유형이 아닙니다.
답변
또 다른 중요한 차이점은 Hashtable 유형은 Lock-free 다중 판독기와 단일 기록기를 동시에 지원하지만 Dictionary는 지원하지 않는다는 것입니다.
답변
MSDN 기사 :는 ”
Dictionary<TKey, TValue>
클래스는 동일한 기능이Hashtable
클래스 A는.Dictionary<TKey, TValue>
(이외의 특정 유형의Object
) 더 나은 것보다 성능이
Hashtable
의 요소가 있기 때문에 값 유형에 대한Hashtable
유형입니다Object
그러므로, 그리고, 권투와 저장하는 경우에 발생할 일반적으로 개봉기 또는 “값 유형 검색 중”
링크 : http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90).aspx
답변
둘 다 사실상 같은 클래스입니다 (분해를 볼 수 있습니다). .Net이 제네릭을 갖기 전에 HashTable이 처음 생성되었습니다. 그러나 사전은 일반 클래스이며 강력한 타이핑 이점을 제공합니다. Dictionary는 비용이 들지 않으므로 HashTable을 사용하지 않습니다.
답변
또 다른 중요한 차이점은 Hashtable
스레드 안전입니다. Hashtable
MR / SW (Multiple Reader / Single Writer) 스레드 안전 기능이 내장되어있어 Hashtable
잠금없이 여러 판독기와 함께 하나의 Writer를 사용할 수 있습니다. 의 경우 Dictionary
가 당신의 안전을 스레드 필요하다면 당신이 당신의 자신의 동기화를 구현해야합니다, 어떤 스레드 안전하지 않습니다.
더 자세히 설명하려면 :
Hashtable
, 컬렉션 주변의 스레드 안전 래퍼를 반환하는 Synchronized 속성을 통해 스레드 안전을 제공합니다. 랩퍼는 모든 추가 또는 제거 조작에서 전체 콜렉션을 잠금으로써 작동합니다. 따라서 컬렉션에 액세스하려는 각 스레드는 해당 차례가 하나의 잠금을 수행하기를 기다려야합니다. 이는 확장 할 수 없으며 대규모 컬렉션의 경우 성능이 크게 저하 될 수 있습니다. 또한 디자인은 경쟁 조건으로부터 완전히 보호되지 않습니다.닷넷 프레임 워크 2.0 컬렉션 클래스 좋아
List<T>
,Dictionary<TKey, TValue>
어떤 스레드 동기화를 제공하지 않는 등; 여러 스레드에서 동시에 항목을 추가하거나 제거 할 때 사용자 코드가 모든 동기화를 제공해야합니다. 스레드 안전성뿐만 아니라 유형 안전성이 필요한 경우 .NET Framework에서 동시 콜렉션 클래스를 사용하십시오. 자세한 내용은 여기를 참조하십시오.