2014-09-30 3 views
0

Пошел через этот своеобразный способ инициализации карт Java inline.Java: Эффективные последствия встроенной инициализации HashMaps

Следующий код выглядит , расширяя класс Hashmap с помощью анонимного класса и затем используя (не статический) блок инициализатора.

Map<String, String> aMap = new HashMap<String, String>() 
{{ 
    put("gloves", "hand"); 
    put("hat", "head"); 
    put("shoes", "feet"); 
    put("scarf", "neck"); 
}}; 

Каковы показатели Подразумевается использования выше код для инициализации HashMaps инлайн?

Я не видел, чтобы это использовалось очень часто. Является ли это хорошей практикой Java?

+0

Почему бы вам не написать тестовое приложение для инициализации некоторых тестовых карт и убедиться сами? – ZeroOne

+0

Первая проблема, которая приходит мне на ум, заключается в том, что анонимные классы производят файл _extra_ .class после компиляции. О производительности ... если бы она использовалась в статической инициализации (= только один раз в JVM), я не думаю, что производительность будет большой. Не уверен, что это хорошая практика, поскольку анонимный класс не может использоваться повторно, и расширение класса должно быть нацелено на изменение его поведения. –

+2

@ZeroOne Правильный бенчмаркинг JIT'd-код чрезвычайно сложный. Прежде чем прибегать к бенчмаркам, важно понять, почему * что-то вроде этого следует ожидать быстрее или медленнее. – Boann

ответ

1

@davison этот вопрос неоднократно обсуждался на SO. Даже если структура данных не совпадает (Set, HashSet) вместо (Карта, HashMap) Я лично думаю, что следующий будет лучше обсуждение и должны прояснить все сомнения: Efficiency of Java "Double Brace Initialization"?

+0

спасибо, что указал! Пропущенный этот пост в моем поиске – davison

+0

это похоже на комментарий. Вы можете пометить вопрос как близкий => дубликат, если хотите. –

+0

@Peter Lawrey thnx, я просто научился помечать вопросы как дубликаты :) – Alboz

0

Это не очень хорошая практика, потому что он создает новый анонимный внутренний класс, который JVM должен использовать больше памяти для отслеживания. Помимо этого, это в основном безвредно.

Лучший способ написания этого кода будет использовать initialisation block:

Map<String, String> aMap = new HashMap<String, String>(); 
{ 
    aMap.put("gloves", "hand"); 
    aMap.put("hat", "head"); 
    aMap.put("shoes", "feet"); 
    aMap.put("scarf", "neck"); 
} 
+0

Если вы создаете каждый байт, вы можете уменьшить начальную емкость. –

0

Каковы производительность подразумевается использование вышеуказанного кода для инициализации hashmaps inline?

Практически нет. В первый раз, когда вы это делаете, есть дополнительная загрузка класса, которая вряд ли будет важна, если вы не заботитесь о количестве используемых вами классов.

Я не видел, чтобы это использовалось очень часто. Является ли это хорошей практикой Java?

Я бы сказал, что это хорошая практика, если он делает код более четким, esp в модульных тестах.

В случае плохой практики, если эта коллекция попадает в поток локально, так как это может помешать выгрузке модуля.