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

2022-09-01 12:56:35

编译器抱怨以下代码:

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

它写入“意外类型”并指向 。如果我用 和 by 替换,编译就正常了。这里有什么问题?intintStringi+1i+"1"


答案 1

这很好,但不能 - Java泛型只适用于引用类型,基本上:(Integerint

试试这个 - 尽管请注意它会框住一切:

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

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