Java 最佳检查并从hashmap获取值

Java 最佳检查并从hashmap获取值,java,hashmap,Java,Hashmap,我有一个具有大量值的hashmap。我想检查它是否有keyId(从列表中),如果有,然后对它执行一个方法。 我应该这样做吗: for (int id : myList) { if (myHashMap.containsKey(id)) { myHashMap.get(id).methodOnObject(); } } for (int id : myList) { myObject temp = myHashMap.get(id); if (

我有一个具有大量值的hashmap。我想检查它是否有key
Id
(从列表中),如果有,然后对它执行一个方法。 我应该这样做吗:

for (int id : myList) {
    if (myHashMap.containsKey(id)) {
         myHashMap.get(id).methodOnObject();
    }
}
for (int id : myList) {
    myObject temp =  myHashMap.get(id);
    if (temp != null) {
        temp.methodOnObject();
    }
}
或者像这样:

for (int id : myList) {
    if (myHashMap.containsKey(id)) {
         myHashMap.get(id).methodOnObject();
    }
}
for (int id : myList) {
    myObject temp =  myHashMap.get(id);
    if (temp != null) {
        temp.methodOnObject();
    }
}

还是其他更好的?

第二个更好。您只查询每个键的HashMap。从理论上讲,从HashMap获取数据的时间复杂度是恒定的。但是,这取决于密钥的分布和HashMap的实现。在某些情况下,它可能会变成LogN。

第二个明显更好。一次搜索而不是两次。@user207421我想是的。但是持续分配无用对象会影响性能吗?这里没有无用对象,也没有无用变量。@user207421我说的对象的键不在
myList
中,我真的不需要它们。我担心get并将其分配给
temp
可能会降低性能如果密钥不在映射中,
get()
返回null,而不是对象。你没有道理。这不是一个具有对数复杂性的树形图吗?@EduardB。是的,TreeMap的时间复杂度为O(LogN)。在HashMap中,开始时,每个插槽都是LinkedList。LinkedList的缺点是:当一个密钥的冲突很大时,时间复杂度可能是O(K),其中K是冲突密钥的总数。正因为如此,当一个关键点的冲突是巨大的,每个插槽将成为一棵树,以防止这种情况发生。但是,HashMap的实现方式取决于每个Java版本。