Java HashMap和int作为键

Java HashMap和int作为键,java,hashmap,Java,Hashmap,我正在尝试构建一个HashMap,它将整数作为键,对象作为值 我的语法是: HashMap<int, myObject> myMap = new HashMap<int, myObject>(); HashMap myMap=newhashmap(); 但是,返回的错误是-标记“int”上的语法错误,该标记后面应该是维度-我不明白为什么要添加维度(即:将int放入数组),因为我只需要将数字存储为键 我能做什么 提前感谢!:) 改用Integer HashMap<

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

我的语法是:

HashMap<int, myObject> myMap = new HashMap<int, myObject>();
HashMap myMap=newhashmap();
但是,返回的错误是-标记“int”上的语法错误,该标记后面应该是维度-我不明白为什么要添加维度(即:将int放入数组),因为我只需要将数字存储为键

我能做什么


提前感谢!:)

改用
Integer

HashMap<Integer, MyObject> myMap = new HashMap<Integer, MyObject>();
HashMap myMap=newhashmap();
Java将自动将
int
原语值自动装箱到
Integer
对象


阅读Oracle Java文档中的更多信息。

将int用作对象,而不是原语类型

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

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

这是HashMap中的函数put(),如您所见,它使用对象表示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;
}
public V put(K键,V值){
if(key==null)
返回putForNullKey(值);
int hash=散列(键);
int i=indexFor(散列,table.length);
for(条目e=表[i];e!=null;e=e.next){
对象k;
如果(e.hash==hash&((k=e.key)==key | | key.equals(k))){
V oldValue=e.value;
e、 价值=价值;
e、 记录存取(本);
返回旧值;
}
}
modCount++;
加法器(散列、键、值、i);
返回null;
}
表达式“k=e.key”应该清楚地说明这一点


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

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

HashMap<int, myObject> myMap = new HashMap<int, myObject>();
基本数据类型自动装箱为整数对象

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

您可以在此处阅读有关自动装箱的更多信息

如果您使用Android编写代码,则可以将整数映射到对象。

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

private final SparseArray<myObject> myMap = new SparseArray<myObject>();
您可以尝试使用Trove

TIntObjectHashMap可能就是您要寻找的。

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

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

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

如果您认为可以通过将原语作为键来提高映射性能,那么有一个名为FastUtil的库,其中包含一个以int-type作为键的映射实现

因此,它比Hashmap快得多

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

数组也是一个对象,因此
HashMap
是一个使用int数组作为键的有效构造


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

对于那些对这样的映射感兴趣的人,因为您希望减少Java中自动装箱的占用,而不是原语类型的包装,我建议使用 . Trove不再受支持了,我相信它在这个意义上是不可靠的库(尽管它非常流行),无法与之相比

在上面的这个例子中


当您需要使用int ->对象映射时,还考虑使用<代码> YouBujjType []/COD>数组或<代码>列表< /C>和按索引访问值,因为MAP本质上是一个int类型的关联数组作为索引。

< P>如果您使用NETY并希望使用具有原始int类型键的映射,则可以使用它的

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

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

专用集合与通用集合的问题可以决定高吞吐量需求的程序的成败。

他也不应该为类命名
myObject
@AdamGent-Correct。所有的类名都应该以大写字母开头,我更正了推荐的代码。我知道你知道:)我只是想确保OP知道/了解。据我所知,他可能在类型参数中添加了一个变量名。请注意,最好在Android上使用
ArrayMap
SimpleArrayMap
,以节省内存并提高性能(),不是键。改为使用
Integer
。是将int自动装箱到Integer更好,还是只将数据存储为字符串更方便?我已经编写了HashMap myMap=new HashMap();但是显示使我对>和-1
。我不像其他人那样在惩罚之前评论(我没有-1你)。记住SparseArray比hashmap慢,但内存效率更高。所以,不要在大型数据集上使用它。SparseArray如何在速度较慢的情况下获得更好的性能?在我的安卓系统中使用哪一个game@Snake
SparseArray
如果您像使用
HashMap
那样分配一组内存装箱和拆箱int,vm将需要暂停执行以便更快地进行垃圾收集。如果你想频繁而快速地做某事,这一点很重要
8 (int) === boxing ===> 8 (Integer)
private final SparseArray<myObject> myMap = new SparseArray<myObject>();
int newPos = 3;

myMap.put(newPos, newObject);
myMap.get(newPos);
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));
    }
}