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

发布于 2024-08-26 05:44:37 字数 367 浏览 4 评论 0原文

编译器抱怨这段代码:

    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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

终弃我 2024-09-02 05:44:37

使用 Integer 没问题,但使用 int 就不行 - Java 泛型仅适用于引用类型,基本上:(

试试这个 - 尽管要注意它会框住所有内容:

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

It's fine with Integer, but not okay with int - Java generics only work with reference types, basically :(

Try this - although be aware it will box everything:

HashMap<String,Integer> userName2ind = new HashMap<String,Integer>();
for (int i=0; i<=players.length; i++) {
    userName2ind.put(orderedUserNames[i],i+1);
}
咆哮 2024-09-02 05:44:37

如果您有小型集合,那么使用引用类型可能没问题,但是还有其他选择,其中一个好的选择是 trove4j。 Trove 在使用纯原语重新创建集合 API 方面做得非常好。回报是内存使用量大大降低,并且在许多情况下,插入/查找时的性能更好。您的示例如下所示:

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

根据我的经验,唯一的缺点是缺乏这些并发实现,因此您必须找出另一种方法来管理线程安全。

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:

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文