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