HashMap和int作为键

时间:2013-04-22 13:39:53

标签: java hashmap

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

我的语法是:

HashMap<int, myObject> myMap = new HashMap<int, myObject>();

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

我该怎么办?

提前致谢! :)

12 个答案:

答案 0 :(得分:123)

改为使用Integer

HashMap<Integer, MyObject> myMap = new HashMap<Integer, MyObject>();

Java会自动将您的int原始值自动装箱到Integer个对象。

从Oracle Java文档中了解有关autoboxing的更多信息。

答案 1 :(得分:40)

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

private final SparseArray<myObject> myMap = new SparseArray<myObject>();

使用它可以使用int而不是像

那样的Integer
int newPos = 3;

myMap.put(newPos, newObject);
myMap.get(newPos);

答案 2 :(得分:18)

您不能使用原语,因为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;
}

表达式“k = e.key”应该清楚说明。

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

答案 3 :(得分:4)

您可以尝试使用Trove http://trove.starlight-systems.com/
TIntObjectHashMap可能正是您所寻找的。

答案 4 :(得分:3)

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

HashMap<int, myObject> myMap = new HashMap<int, myObject>();

无效。

您必须将声明更改为

HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();

所以即使你做了以下

myMap.put(2,myObject);

原始数据类型被自动装箱到Integer对象。

8 (int) === boxing ===> 8 (Integer)

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

答案 5 :(得分:3)

如果您在Android中编码,则会有SparseArray,将整数映射到对象。

答案 6 :(得分:2)

HashMap 不允许原语作为键的主要原因是HashMap的设计方式是为了比较键,它使用 < em> equals() 方法,只能在不在基元上的对象上调用方法。

因此,当int被自动装箱到Integer时,Hashmap可以在Integer对象上调用 equals() 方法。

这就是为什么你应该使用Integer而不是int。我的意思是hashmap在将int作为键时抛出错误(不知道抛出的错误的含义)

如果您认为这样,您可以通过将基元作为键来提高Map性能,有一个名为 FastUtil 的库,其中包含一个带有int的Map实现键入键。

因此,它比 Hashmap

快得多

答案 7 :(得分:1)

使用int作为Object而不是原始类型

HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();

答案 8 :(得分:1)

对于那些对这样的地图感兴趣的人,因为您想减少原始类型的包装Java中的自动装箱足迹,我建议使用 Eclipse collections不再支持Trev ,我认为从这个意义上说,它是一个非常不可靠的库(尽管无论如何它都很流行),因此无法与Eclipse collections进行比较。

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));
    }
}

在此示例中,IntObjectHashMap以上。

当您需要 int-> object 映射时,还应考虑使用YourObjectType[]数组或List<YourObjectType>并按索引访问值,因为map本质上是一种关联整数类型为索引的数组。

答案 9 :(得分:0)

请使用 HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();

答案 10 :(得分:0)

  

我不明白为什么我要添加一个维度(即:将int变成数组)因为我只需要将一个数字存储为键。

数组也是一个Object,因此HashMap<int[], MyObject>是一个使用int数组作为键的有效结构。

编译器不知道你想要什么或你需要什么,它只是看到一个几乎正确的语言结构,并警告它缺少什么是完全正确的。

答案 11 :(得分:0)

如果您正在使用Netty,并且想使用带有原始int类型键的地图,则可以使用其IntObjectHashMap

使用原始类型集合的一些原因:

  • 使用专门的代码提高性能
  • 减少可能给GC造成压力的垃圾

专用集合与通用集合的问题可能会产生或破坏具有高吞吐量要求的程序。