Допустим, мне нужно преобразовать String
в целое число. Целые числа уникальны и образуют непрерывный диапазон, начиная с 0. То есть:
Hello -> 0
World -> 1
Foo -> 2
Bar -> 3
Spam -> 4
Eggs -> 5
etc.
Есть как минимум два простых способа сделать это. С помощью хэш-карты:
HashMap<String, Integer> map = ...
int integer = map.get(string); // Plus maybe null check to avoid NPE in unboxing.
Или со списком:
List<String> list = ...
int integer = list.indexOf(string); // Plus maybe check for -1.
Какой подход мне следует использовать и почему? Возможно, относительная производительность зависит от размера списка / карты, поскольку List # indexOf ()
- это линейный поиск с использованием String # equals ()
-> O (n) эффективности, в то время как HashMap # get ()
использует хэш для сужения поиска -> определенно более эффективен, когда карта большая, но, возможно, хуже, когда есть всего несколько элементов (должны быть некоторые накладные расходы при вычислении хеша, правильно?).
Поскольку тестирование Java-кода должным образом является сложной задачей, Я хотел бы получить несколько обоснованных предположений. Правильно ли мое рассуждение выше (список лучше для маленького, карта лучше для большого)? Какой приблизительно размер порога? В чем разница между реализациями List
и HashMap
?