#java #map #set #time-complexity
#java #Карта #установить #временная сложность
Вопрос:
Мне нужен HashMap
с подписью
HashMap<Integer, Double> map;
Но я инкапсулировал два значения, такие как:
class CustomKV
{
Integer key;
Double value;
}
Следовательно, Map<>
становится
Set<CustomKV> customMap;
Если бы я использовал Map
, когда я хотел выполнить итерацию по ключам, map.keySet()
было бы достаточно.
Однако, если я использую второе, мне нужно выполнить итерацию по объектам CustomKV
, а затем добавить все key
s, добавить их в набор, а затем вернуть его.
Мой вопрос: есть ли у Java оптимизация для этого? Или каждый раз, когда я вызываю keySet()
, он будет выполнять итерации по объектам?
Редактировать:
Здесь я пишу разницу в двух итерациях:
for(Integer i : map.keySet())
for(CustomKV kv : customMap())
кажется, они идентичны. Но я спрашиваю, если я продолжу вызывать
for(CustomKV kv : customMap)
int key = kv.getKey();
Это замедлит меня, или Java распознает это и обрабатывает customMap
как карту?
Комментарии:
1. К каким значениям вы хотите получить доступ? И в чем причина использования вашего пользовательского класса KV вместо Map?
2. Что бы вы вызвали,
keySet()
если используете свой пользовательскийSet
интерфейс?3. @shmosel Я также напишу собственный
keySet()
метод.4. @MKorsch Я использую его для моделирования списка смежности вершины в графе.
5. Почему повторение
Set<CustomKV>
будет более или менее эффективным, чем повторениеSet<Integer>
?
Ответ №1:
Если вы спрашиваете о реализации Java, HashMap
кэширует ли набор после первого вызова keySet()
. Но даже первый вызов не требует никаких итераций, поскольку он возвращает только представление или оболочку базового набора записей.
Итак, да, Java оптимизирует их реализацию, но технически вы могли бы применить те же оптимизации к своему пользовательскому набору.
Ответ №2:
keySet()
не создает новый Set
.
Он просто предлагает просмотр ключей на вашей карте. На самом деле он предоставляет только несколько операций, которые являются итерацией (с удалением), размером, пустотой, очисткой и содержит. Вы не можете добавить к нему элемент, иначе он выдаст UnsupportedOperationException
.
Ответ №3:
Если имеется более 2 полей, мы должны перейти к классу, как в вашем примере. Set<CustomKV> customMap;
и если там только два значения, лучше использовать Hashmap.
В обоих случаях мы можем выполнять итерации.
Но в случае Hashmap мы можем получить доступ value
с помощью get
метода, используя key
и мы можем избежать итерации.