대부분의 프로그래밍 언어에서 사전은 해시 테이블보다 선호됩니다. 그 이유는 무엇입니까?
답변
그만한 가치가있는 사전 은 (개념적으로) 해시 테이블입니다.
” 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 후 ArrayList
및 HashTable
교환되었다 List
& Dictionary
. 이제 Arraylist
&HashTable
는 현재 프로젝트에서 더 이상 사용되지 않습니다.
의 차이에 오는 HashTable
및 Dictionary
, 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);
}
}
}