Почему компилятор Java не любит примитив int как тип для значений в HashMap? - PullRequest
25 голосов
/ 24 марта 2010

Компилятор жалуется на этот код:

    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", компиляция пойдет хорошо Что здесь не так?

Ответы [ 2 ]

41 голосов
/ 24 марта 2010

Это нормально с Integer, но не хорошо с int - Обобщения Java работают только со ссылочными типами , в основном: (

Попробуйте это - хотя имейте в виду, что все будет упаковано:

HashMap<String,Integer> userName2ind = new HashMap<String,Integer>();
for (int i=0; i<=players.length; i++) {
    userName2ind.put(orderedUserNames[i],i+1);
}
2 голосов
/ 15 июня 2012

Если у вас есть небольшие коллекции, то использование справочных типов, вероятно, хорошо, но есть альтернативы, и хорошим является trove4j . Trove довольно хорошо воссоздает API коллекций, используя чистые примитивы. Вознаграждение - намного меньшее использование памяти и во многих случаях лучшая производительность при вставке / поиске. Ваш пример будет выглядеть так:

TObjectIntHashMap<String> userName2ind = new TObjectIntHashMap<String>();
for (int i=0; i<=players.length; i++) {
    userName2ind.put(orderedUserNames[i],i+1);
}

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

...