2014-01-28 3 views
1

Мне нужно выполнить итерацию некоторых HashMaps на каждом кадре цикла OpenGL. Я делаю это так:Вызывает ли HashMap.entrySet() экземпляр и заполняет новый набор каждый раз?

for (Map.Entry<MyKey, MyValue> entry : myMap.entrySet(){...} 

Моя забота о том, действительно ли конкретизирует этот призыв к entrySet() и населяет совершенно новый объект Map.Entry каждый раз, когда это называется, потому что если он есть, GC будет более насыщенной, чем Я бы хотел, когда анимация в OpenGL. Моя кишка говорит «нет», потому что в документации HashMap говорится, что вы можете напрямую модифицировать HashMap с помощью набора возвращаемых записей, но я не знаю, как точно сказать.

И еще мне хотелось бы узнать о других реализациях карты, таких как Hashtable, TreeMap и LinkedHashMap.

+1

Исходный код JDK, является общедоступной информацией, просто посмотрите его. –

+0

Три года назад, и я этого не знал! – Tenfour04

+0

Кроме того, ваша установка JDK должна содержать 'src.zip' со всем источником, который вы связываете с IDE. –

ответ

0

Реализация HashMap.entrySet - это просто дешевый вид и занимает время O (1), создаваемое каждый раз, когда вы его вызываете. Объекты записи, которые вы получаете посредством итерации по ней, фактически являются объектами, используемыми картой для реализации своих внутренних структур данных.

(Это и есть на самом деле нет другого способа сделать вещи, которые вы хотели бы сделать с ней.)

+0

Все три из этих ответов предоставляют дополнительную информацию, но это был полезный способ взглянуть на нее. В моем случае я не очень беспокоюсь о времени создания. Просто не хотите создавать экземпляры и разрешать выпуск многих небольших объектов, потому что GC может вызывать анимационные икоты. – Tenfour04

1

После проверки источника ответа нет. Он лениво инстанцирует запись, установленную при первом вызове, на entrySet(), а затем возвращает ссылку на тот же объект при каждом последующем вызове.

То же самое верно для LinkedHashMap, Hashtable и TreeMap.

1

Нет, он не создает новый набор, а скорее облегченную упаковку, например, например. Arrays.asList делает, API говорит The set is backed by the map, so changes to the map are reflected in the set, and vice-versa.

Смежные вопросы