为什么Java编译器不喜欢原始int作为HashMap中值的类型?
编译器抱怨这段代码:
HashMap userName2ind = new HashMap(); for (int i=0; i<=players.length; i++) { userName2ind.put(orderedUserNames[i],i+1); }
它写出“意外类型”并指向int
。 如果我用String
替换int
而i+1
用i+"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); }
根据我的经验,唯一的缺点是没有这些的并发实现,所以你必须找到另一种管理线程安全的方法。