为什么 Java 编译器不喜欢原始 int 作为 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"
,编译就会正常。这里有什么问题吗?
The compiler complains about this code:
HashMap<String,int> userName2ind = new HashMap<String,int>();
for (int i=0; i<=players.length; i++) {
userName2ind.put(orderedUserNames[i],i+1);
}
It writes "unexpected type" and point on int
. If I replace int
by String
and i+1
by i+"1"
, the compilation goes OK. What is wrong with in here?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使用
Integer
没问题,但使用int
就不行 - Java 泛型仅适用于引用类型,基本上:(试试这个 - 尽管要注意它会框住所有内容:
It's fine with
Integer
, but not okay withint
- Java generics only work with reference types, basically :(Try this - although be aware it will box everything:
如果您有小型集合,那么使用引用类型可能没问题,但是还有其他选择,其中一个好的选择是 trove4j。 Trove 在使用纯原语重新创建集合 API 方面做得非常好。回报是内存使用量大大降低,并且在许多情况下,插入/查找时的性能更好。您的示例如下所示:
根据我的经验,唯一的缺点是缺乏这些并发实现,因此您必须找出另一种方法来管理线程安全。
If you have small collections, then using reference types is probably fine, but there are alternatives and good one is trove4j. Trove does a pretty good job of recreating the collections API using pure primitives. The payoff is much lower memory usage and in many cases, better performance when inserting/looking up. Your example would look like this:
The only downside, in my experience, is the absence of concurrent implementations of these, so you have to figure out another way to manage thread safety.