Я обычно использую HashMap
в своих программах, так как я знаю, что обычно он наиболее эффективен (при правильном использовании) и легко справляется с большими картами. Я знаю о EnumMap
, который очень полезен для ключей перечисления, но часто я создаю небольшую карту, которая никогда не станет очень большой, скорее всего, скоро будет отброшена и не будет проблем с параллелизмом.
Является ли HashMap<K,V>
слишком сложным для этих небольших, локальных и временных применений? Есть ли другая, простая реализация, которую я могу использовать в этих случаях?
Мне кажется, я ищу реализацию Map
, аналогичную ArrayList
для List
. Это существует?
Добавлено позже после ответов:
Вот сценарий, в котором медленная, но очень простая реализация может быть лучше - когда у меня много, многие из этих Map
с. Предположим, например, у меня есть миллион или около того этих крошечных карт, каждая из которых содержит несколько (часто менее трех) записей. У меня низкий референтный уровень - возможно, я на самом деле не ссылаюсь на них, пока они не будут отброшены в большинстве случаев Это все еще тот случай, когда HashMap
- лучший выбор для них?
Использование ресурсов - это больше, чем просто скорость. Мне бы хотелось что-то, что не фрагментирует кучу и, к примеру, заставляет GC занимать много времени.
Возможно, HashMap
является правильным ответом, но это не случай преждевременной оптимизации (или, по крайней мере, это не так).
Добавлено намного позже, после некоторой мысли:
Я решил написать свой собственный код SmallMap
. Это легко сделать с помощью AbstractMap
. Я также добавил пару конструкторов, чтобы SmallMap
можно было построить из существующего Map
.
По пути я должен был решить, как представлять Entry
с и реализовать SmallSet
для метода entrySet
.
Я многому научился благодаря кодированию (и юнит-тестированию) и хочу поделиться этим, если кто-то еще захочет. Это на github здесь .