Почему компилятор Java не похож на примитивный int как тип значений в HashMap?
Компилятор жалуется на этот код:
HashMap<String,int> userName2ind = new HashMap<String,int>();
for (int i=0; i<=players.length; i++) {
userName2ind.put(orderedUserNames[i],i+1);
}
Он пишет "неожиданный тип" и указывает на int
. Если я заменил int
на String
и i+1
на i+"1"
, компиляция будет выполнена. Что здесь не так?
Ответы
Ответ 1
Это нормально с Integer
, но не в порядке с int
- Java generics работает только с ссылочными типами, в основном: (
Попробуй это - хотя будьте осторожны, все будет в коробке:
HashMap<String,Integer> userName2ind = new HashMap<String,Integer>();
for (int i=0; i<=players.length; i++) {
userName2ind.put(orderedUserNames[i],i+1);
}
Ответ 2
Если у вас небольшие коллекции, то использование ссылочных типов, вероятно, хорошо, но есть альтернативы, а хороший - trove4j. Trove делает довольно хорошую работу по воссозданию API коллекций с использованием чистых примитивов. Выплата намного ниже, чем использование памяти, и во многих случаях улучшает производительность при вставке/поиске. Ваш пример будет выглядеть так:
TObjectIntHashMap<String> userName2ind = new TObjectIntHashMap<String>();
for (int i=0; i<=players.length; i++) {
userName2ind.put(orderedUserNames[i],i+1);
}
Единственным недостатком, по моему опыту, является отсутствие параллельных реализаций, поэтому вам нужно выяснить другой способ управления безопасностью потоков.