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

编译器抱怨这段代码:

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

它写出“意外类型”并指向int 。 如果我用String替换inti+1i+"1"替换,则编译就可以了。 这里有什么问题?

它对Integer很好,但对int不行 – Javagenerics只适用于引用类型 ,基本上:(

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

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

如果你有小的集合,那么使用引用类型可能没什么问题,但是有其他选择,而且好的是trove4j 。 Trove在使用纯原语重新创建集合API方面做得非常好。 收益大大降低了内存使用率,在许多情况下,插入/查找时性能更高。 你的例子看起来像这样:

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

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