[c#] C #에서 Hashtable보다 Dictionary가 선호되는 이유는 무엇입니까?

대부분의 프로그래밍 언어에서 사전은 해시 테이블보다 선호됩니다. 그 이유는 무엇입니까?



답변

그만한 가치가있는 사전 (개념적으로) 해시 테이블입니다.

Dictionary<TKey, TValue>클래스 대신 클래스를 사용하는 이유는 Hashtable무엇입니까?” 를 의미한다면 쉬운 대답 Dictionary<TKey, TValue>입니다. 일반적인 유형입니다.Hashtable 입니다. 즉 Dictionary<TKey, TValue>, 임의의 객체를 삽입 할 수 없으며 취한 값을 캐스팅 할 필요가 없기 때문에 유형 안전을 얻을 수 있습니다.

흥미롭게도 Dictionary<TKey, TValue> .NET Framework 구현 Hashtable은 소스 코드에서이 주석에서 알 수 있듯이을 기반으로합니다 .

일반 사전은 Hashtable의 소스에서 복사되었습니다.

출처


답변

Dictionary<<< >>> Hashtable차이점 :

  • 일반 <<< >>> 비 제네릭
  • 자체 스레드 동기화 필요 <<< >>> 메소드를 통해 스레드 안전 버전 제공Synchronized()
  • 열거 된 항목 : KeyValuePair<<< >>> 열거 된 항목 :DictionaryEntry
  • 최신 (> .NET 2.0 ) <<< >>> 이전 ( .NET 1.0 부터 )
  • System.Collections.Generic <<< >>> 인 은 System.Collections
  • 존재하지 않는 키에 대한 요청에서 예외 <<< >>> 가 발생 함 존재하지 않는 키에 대한 요청이 null을 반환 함
  • 값 유형 <<< >>>의 경우 잠재적으로 조금 더 빠름 값 유형의 경우 조금 느리게 (박싱 / 언 박싱 필요)

Dictionary/ Hashtable유사점 :

  • 둘 다 내부적으로 해시 테이블입니다 == 키에 따라 많은 항목 데이터에 빠르게 액세스
  • 둘 다 필요 불변의 고유 키 합니다
  • 둘 다의 열쇠는 자신의 GetHashCode()방법이 필요합니다

유사한 .NET 컬렉션 (사전 및 해시 테이블 대신 사용할 후보) :

  • ConcurrentDictionary스레드 안전 (여러 스레드에서 동시에 안전하게 액세스 가능)
  • HybridDictionary최적화 된 성능 (작은 품목 및 많은 품목)
  • OrderedDictionary-int 인덱스를 통해 값에 액세스 할 수 있습니다 (항목이 추가 된 순서대로)
  • SortedDictionary -아이템 자동 정렬 된
  • StringDictionary문자열을 강력하게 입력하고 최적화

답변

때문에 Dictionary일반 클래스 (이다 Dictionary<TKey, TValue>), 그 콘텐츠에 액세스되도록하는 (즉, 당신은에서 캐스트 할 필요가 없습니다 유형 안전 Object당신이와 마찬가지로, Hashtable).

비교

var customers = new Dictionary<string, Customer>();
...
Customer customer = customers["Ali G"];

var customers = new Hashtable();
...
Customer customer = customers["Ali G"] as Customer;

그러나 Dictionary내부적으로 해시 테이블로 구현되므로 기술적으로 동일한 방식으로 작동합니다.


답변

참고 : .NET에서는 Hashtable여러 판독기 스레드와 단일 쓰기 스레드에서 사용하기에 안전한 스레드입니다.Dictionary 에 스레드 안전하지만 공용 정적 멤버는 스레드 안전하지만 모든 인스턴스 멤버는 스레드 안전을 보장하지 않습니다.

Hashtable이 때문에 모든 사전을 다시 바꿔야 했습니다.


답변

.NET에서의 차이 Dictionary<,>와는 HashTable정적 유형 검사 (감소 복싱의 측면에서 제네릭의 모든 혜택을받을 수 있도록 전자는 일반적인 유형이며, 주로이다,하지만 사람들이 생각하는 경향이 큰대로되지 않습니다 성능 측면-권투에 대한 명확한 메모리 비용이 있습니다).


답변

사람들은 사전이 해시 테이블과 동일하다고 말합니다.

반드시 그런 것은 아닙니다. 해시 테이블은 사전 을 구현 하는 한 가지 방법 입니다. 그 전형적인 점이며 Dictionary클래스의 .NET에서 기본값 일 수 있지만 정의상 유일한 것은 아닙니다.

링크 된 목록이나 검색 트리를 사용하여 사전을 똑같이 잘 구현할 수 있지만 효율적이지 않습니다 (일부 메트릭의 경우 효율적).


답변

Collections& Generics는 객체 그룹을 처리하는 데 유용합니다. .NET에서 모든 컬렉션 개체는 인터페이스 아래에 있으며이 인터페이스 IEnumerable에는 ArrayList(Index-Value))&가 HashTable(Key-Value)있습니다. .NET 프레임 워크 2.0 후 ArrayListHashTable교환되었다 List& Dictionary. 이제 Arraylist&HashTable 는 현재 프로젝트에서 더 이상 사용되지 않습니다.

의 차이에 오는 HashTableDictionary, Dictionary로 어디 제네릭 Hastable일반 없습니다. 에 모든 유형의 객체를 추가 할 수 HashTable있지만 검색하는 동안 필요한 유형으로 캐스트해야합니다. 따라서 형식이 안전하지 않습니다. 그러나dictionary 선언하면서 키와 값의 유형을 지정할 수 있으므로 검색하는 동안 캐스트 할 필요가 없습니다.

예를 보자.

해시 테이블

class HashTableProgram
{
    static void Main(string[] args)
    {
        Hashtable ht = new Hashtable();
        ht.Add(1, "One");
        ht.Add(2, "Two");
        ht.Add(3, "Three");
        foreach (DictionaryEntry de in ht)
        {
            int Key = (int)de.Key; //Casting
            string value = de.Value.ToString(); //Casting
            Console.WriteLine(Key + " " + value);
        }

    }
}

사전,

class DictionaryProgram
{
    static void Main(string[] args)
    {
        Dictionary<int, string> dt = new Dictionary<int, string>();
        dt.Add(1, "One");
        dt.Add(2, "Two");
        dt.Add(3, "Three");
        foreach (KeyValuePair<int, String> kv in dt)
        {
            Console.WriteLine(kv.Key + " " + kv.Value);
        }
    }
}