HashMap和int作为键

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

我的语法是:

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

但是,返回的错误是 – 标记“int”的语法错误,在这个标记之后预期的维度 – 我不明白为什么我应该添加一个维度(即:使int成为一个数组),因为我只需要存储一个数字作为关键。

我能做什么?

提前致谢! 🙂

改用Integer

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

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

阅读更多关于Oracle Java文档自动装箱的信息。

对于所有为Android设备编码的Java代码,最后到这里:使用SparseArray来获得更好的性能

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

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

 int newPos = 3; myMap.put(newPos, newObject); myMap.get(newPos); 

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

您不能使用原语,因为HashMap在内部使用对象作为键。 所以你只能使用从Objectinheritance的对象(即任何对象)。

这是函数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; } 

expression式“k = e.key”应该清楚。

我build议使用像Integer和自动装箱的包装。

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

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

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

不pipe用。

你必须改变声明

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

所以即使你做了以下

 myMap.put(2,myObject); 

原始数据types被自动装箱到一个Integer对象。

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

你可以阅读更多的自动装箱在这里http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

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

使用int作为Object而不是原始types

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

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

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

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

如果你认为这样,你可以通过把一个基本元素作为一个键来使Map性能更快,还有一个叫做FastUtil的库,它包含一个以inttypes作为键的Map实现。

正因为如此,它比Hashmap快得多