HashMap 和 int 作为键

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

我的语法是:

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

然而,返回的错误是-“ int”令牌上的语法错误,这个令牌后期望的维度-我不明白为什么我要添加一个维度(即: 使整数成为一个数组) ,因为我只需要存储一个数字作为键。

我能做什么?

提前谢谢! :)

231768 次浏览

使用 Integer代替。

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

Java 将自动将 int基元值自动装箱到 Integer对象。

从 OracleJava 文档中了解更多关于 autoboxing的信息。

使用 int 作为 Object 而不是作为基元类型

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

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

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

这是 HashMap 中的 put ()函数,可以看到它使用 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”应该表达清楚。

I suggest to use a wrapper like Integer and autoboxing.

HashMap 不允许将基本数据类型作为参数

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

没用的。

您必须将声明更改为

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

所以即使你做了下面这些

myMap.put(2,myObject);

The primitive data type is autoboxed to an Integer object.

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

你可以在这里阅读更多关于自动装箱的内容

如果你用 Android 编写代码,有一个 SparseArray,把整数映射到对象。

For everybody who codes Java for Android devices and ends up here: use SparseArray for better performance;

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

有了这个,你可以用 int 代替 Integer like;

int newPos = 3;


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

您可以尝试使用 Trovehttp://trove.starlight-systems.com/
TIntObjectHashMap 可能就是您要寻找的。

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

Thus when int is autoboxed to Integer, Hashmap can call 等于() method on Integer object.

That is why, you should use Integer instead of int. I mean hashmap throws an error while putting int as a key (Don't know the meaning of the error that is thrown)

如果您认为可以通过使用原语作为键来提高 Map 的性能,那么有一个名为 快捷键的库,它包含一个以 int 类型作为键的 Map 实现。

正因为如此,它比 哈希地图快得多

我不明白为什么我要添加一个维度(例如: 使整数成为一个数组) ,因为我只需要存储一个数字作为关键。

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

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

对于那些对这样的映射感兴趣的人,因为您希望在 Java 中减少基本类型的包装器的 自动装箱的足迹,我建议您使用 Eclipse 集合 。从这个意义上说,我相信它是相当不可靠的库(尽管它相当流行) ,无法与 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));
}
}

在上面的这个例子中,IntObjectHashMap

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

如果您正在使用 Netty,并且希望使用具有基本 int 类型键的映射,则可以使用它的 IntObjectHashMap

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

  • improve performance by having specialized code
  • 减少可能给 GC 带来压力的垃圾

专门化集合与广义集合之间的问题可能决定高吞吐量需求程序的成败。

就像列表不接受原始数据一样,map 也不接受原始数据类型作为键或值。如果我们尝试将原始数据类型作为键值对,它将执行自动装箱