HashMap和int作为键

MrD*_*MrD 100 java hashmap

我正在尝试构建一个HashMap,它将整数作为键,对象作为值.

我的语法是:

HashMap<int, myObject> myMap = new HashMap<int, myObject>();
Run Code Online (Sandbox Code Playgroud)

但是,返回的错误是 - 令牌"int"上的语法错误,此令牌后预期的维度 - 我不明白为什么我应该添加维度(即:将int转换为数组)因为我只需要存储一个数字作为关键.

我能做什么?

提前致谢!:)

gab*_*sch 128

Integer改用.

HashMap<Integer, MyObject> myMap = new HashMap<Integer, MyObject>();
Run Code Online (Sandbox Code Playgroud)

Java将自动将int原始值自动装箱到Integer对象.

阅读有关Oracle Java文档中的自动装箱的更多信息.

  • 他也不应该命名一个类`myObject` (10认同)
  • 我知道你知道:)我只是想确保OP知道/学习.据我所知,他本可以在type参数中添加变量名. (3认同)
  • 请注意,在 Android 上最好使用 `ArrayMap` 或 `SimpleArrayMap` 来节省内存并提高性能([更多信息](https://medium.com/google-developers/developing-for-android- ii-bb9a51f8c8b9)) (2认同)

小智 41

对于为Android设备编写Java代码并在此处结束的所有人:使用SparseArray以获得更好的性能

private final SparseArray<myObject> myMap = new SparseArray<myObject>();
Run Code Online (Sandbox Code Playgroud)

有了这个,你可以使用int而不是Integer之类的

int newPos = 3;

myMap.put(newPos, newObject);
myMap.get(newPos);
Run Code Online (Sandbox Code Playgroud)

  • 请记住,SparseArray比hashmap慢,但内存效率更高.因此,不要在大型​​数据集上使用它. (7认同)

use*_*212 22

您不能使用原语,因为HashMap在内部使用对象作为键.因此,您只能使用从Object继承的对象(即任何对象).

这是函数put()在HashMap中,你可以看到它使用Object for K:

public V put(K key, V value) {
    if (key == null)
        return putForNullKey(value);
    int hash = hash(key);
    int i = indexFor(hash, table.length);
    for (Entry<K,V> e = table[i]; e != null; e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue;
        }
    }

    modCount++;
    addEntry(hash, key, value, i);
    return null;
}
Run Code Online (Sandbox Code Playgroud)

表达式"k = e.key"应该清楚.

我建议使用像Integer和autoboxing这样的包装器.


Lak*_*hmi 6

HashMap 不允许原始数据类型作为参数。它只能接受对象,所以

HashMap<int, myObject> myMap = new HashMap<int, myObject>();
Run Code Online (Sandbox Code Playgroud)

不管用。

您必须将声明更改为

HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
Run Code Online (Sandbox Code Playgroud)

所以即使您执行以下操作

myMap.put(2,myObject);
Run Code Online (Sandbox Code Playgroud)

原始数据类型会自动装箱为 Integer 对象。

8 (int) === boxing ===> 8 (Integer)
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关自动装箱的更多信息http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html


Are*_*rek 5

您可以尝试使用Trove http://trove.starlight-systems.com/
TIntObjectHashMap可能是您想要的。


Ale*_*lex 5

对于对此类映射感兴趣的人,因为您希望减少Java 中基本类型包装器的自动装箱占用空间,我建议使用 Eclipse 集合Trove 不再受支持,我相信从这个意义上来说它是相当不可靠的库(尽管它无论如何都很流行)并且无法与Eclipse 集合进行比较。

import org.eclipse.collections.impl.map.mutable.primitive.IntObjectHashMap;

public class Check {
    public static void main(String[] args) {
        IntObjectHashMap map = new IntObjectHashMap();

        map.put(5,"It works");
        map.put(6,"without");
        map.put(7,"boxing!");

        System.out.println(map.get(5));
        System.out.println(map.get(6));
        System.out.println(map.get(7));
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中IntObjectHashMap

当您需要int->object映射时,还要考虑使用YourObjectType[]数组或List<YourObjectType>通过索引访问值(因为映射本质上是一个关联数组)。