Можно ли создать в Java HashMap, который сохраняет свою начальную длину?
Я хочу создать hashMap
private Map<Integer,specificObject> myMap;
myMap = new HashMap <Integer,SpecificObject>(initialCapacity);
Возможно ли, что емкость myMap останется неизменной для всей программы? даже если мы достигли полной мощности.
4 ответа
Вы можете написать метод, который проверяет текущий размер hashmap и генерирует пользовательское исключение, если размер больше n, где n - максимальная емкость, которую вы хотите.
Теперь в коде добавьте вызов вышеупомянутому методу, прежде чем писать map.put.
Это гарантирует, что вы не добавите элементы на карту, когда она превысит ваш пользовательский лимит.
В то время как стандартная библиотека Java не имеет реализации кэша, ограничивающего размер, в Google Guava есть такой класс. Посмотрите на https://code.google.com/p/guava-libraries/wiki/CachesExplained. Кэш имеет тот же интерфейс, что и карта, с дополнительными функциями, такими как ограничение размера, время ожидания для записей и т. Д., Которые можно определить при создании кэша.
Вы можете реализовать такой класс самостоятельно. (Очевидный подход заключается в создании класса-обертки для HashMap
который проверял размер карты, и так далее каждый раз, когда вы звонили put
.)
Тем не менее, регулярный HashMap
класс не работает таким образом. И кроме того, initialCapacity
Параметр:
- не размер карты,
- не фактическое количество записей1, которые вы можете сохранить до того, как карта будет расширена, и
- не предоставляется через доступную переменную или геттер.
1 - Это число определяется по формуле, включающей начальную емкость и коэффициент загрузки.
Во-первых, initialCapacity
это не реальная емкость.
Когда вы проходите 12
, емкость 16
, что означает, что вы передаете, система будет использовать b >= a
и в основном достигая 2^N
,
Во-вторых, в hashmap есть factor = most num / all capacity
, Например, если коэффициент = 0,5, а емкость равна 16, когда вы поместите 8 объектов, размер будет увеличиваться автоматически.