为什么Java编译器不喜欢原始int作为HashMap中值的类型?

时间:2010-03-24 15:24:32

标签: java types integer 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",则编译就可以了。这里有什么问题?

2 个答案:

答案 0 :(得分:41)

Integer没关系,int - Java generics only work with reference types也不行,基本上是:(

试试这个 - 虽然要知道它会包装一切:

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

答案 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);
}

根据我的经验,唯一的缺点是缺少这些的并发实现,所以你必须找到另一种管理线程安全的方法。