🌍 C# Study/C# 케이스 스터디
HashSet vs HashTable vs Dictionary
맨텀
2021. 4. 30. 16:12
세 가지 컬렉션 모두 해시 기반이기 때문에 검색의 복잡도가 O(1)로 굉장히 빠르다.
순서가 존재하지 않으며 수학에서의 '집합' 개념에 해당한다.
1. Dictionary<TKey, TValue>
- 세 가지 컬렉션 중 가장 많이 사용되고 익숙한 자료구조.
- Key와 Value를 사용하여 자료를 저장한다.
- 중복 Key를 허용하지 않는다.
- 제네릭으로 키와 밸류의 타입을 미리 정할 수 있어 박싱과 언박싱이 발생하지 않는다.
var dict = new Dictionary<string, int>();
dict.Add("A", 1);
dict.Remove("A");
int myNum = dict["A"];
2. HashTable
- Key와 Value를 사용하여 자료를 저장한다.
- 중복 Key를 허용하지 않는다.
- Key와 Value 둘 다 Object형식을 사용한다. (박싱 언박싱 발생)
- Value가 Object형식이기 때문에 타입에 상관없이 여러 형태를 저장할 수 있다.
var hash = new Hashtable();
hash.Add("A", 1);
hash.Remove("A");
int myNum = (int)hash["A"];
3. HashSet<T>
- 키가 별도로 존재하지 않으며, 밸류로만 이루어져 있다.
- 순서가 존재하지 않으며, {0, 1, 2}는 {2, 1, 0} 과 같다.
- 각 항목의 중복을 허용하지 않는다.
HashSet<int> uniqueVals = new HashSet<int>();
uniqueVals.Add(1);
uniqueVals.Remove(1);
- Add함수의 bool 반환 값으로 중복여부를 알 수 있다.
if(hashset.Add(value))
// 삽입 성공
else
// 삽입 실패 (중복)
HashSet은 딱히 써보지 않았었는데,
의미 없는 키를 부여하거나 밸류와 동일한 키를 사용해서 Dictionary에 넣는 것보다
HashSet을 활용하는 게 나을 듯하다.