Подтвердить что ты не робот

Почему компилятор 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", компиляция будет выполнена. Что здесь не так?

4b9b3361

Ответ 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);
}

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