Java:将元素添加到HashMap内的列表中

Java:将元素添加到HashMap内的列表中,java,performance,list,map,Java,Performance,List,Map,我想知道是否有更有效的方法将元素添加到hashmap中的列表中,而不是复制列表,将元素添加到copylist中,然后使用与列表关联的特定键在映射中放置,以覆盖该映射部分位置 Map <Integer, List<Object>> myMap = new HashMap <Integer, List<Object>>(); ....add function List <Object> tmp = new LinkedList();

我想知道是否有更有效的方法将元素添加到hashmap中的列表中,而不是复制列表,将元素添加到copylist中,然后使用与列表关联的特定键在映射中放置,以覆盖该映射部分位置

Map <Integer, List<Object>> myMap = new HashMap <Integer, List<Object>>();


....add function

List <Object> tmp = new LinkedList();
if (myMap.containsKey(myListKey.hashCode())) { //keycheck
    tmp = myMap.get(myListKey.hashCode());     //copy
    tmp.add(myObjectToAdd);                    //add
    myMap.put(myListKey.hashCode(), tmp);      //overwrite
}
Map myMap=newhashmap();
…添加功能
List tmp=newlinkedlist();
if(myMap.containsKey(myListKey.hashCode()){//keycheck
tmp=myMap.get(myListKey.hashCode());//复制
tmp.add(myObjectToAdd);//add
myMap.put(myListKey.hashCode(),tmp);//覆盖
}

我尝试了几种直接访问内部列表的方法,但编译器今天似乎正处于运行期…

首先,没有理由调用
hashCode()
将项目放入列表。首先,不同的键可以具有相同的哈希代码,这将导致您可能不想要的行为。只要把钥匙本身当作钥匙就行了。
HashMap
将在内部使用密钥的哈希代码来高效地执行get/put操作

您的add函数应该更像这样:

Map<ListKeyType, List<Object>> myMap = ...

... add function

List<Object> tmp = myMap.get(myListKey);
if (tmp == null) {
    tmp = new LinkedList<Object>();
    myMap.put(myListKey, tmp);
}
tmp.add(myObjectToAdd);
Map myMap=。。。
... 添加函数
List tmp=myMap.get(myListKey);
if(tmp==null){
tmp=新链接列表();
myMap.put(myListKey,tmp);
}
tmp.add(myObjectToAdd);

这样,您只在地图不包含密钥时创建一个新列表。

您可以使用Ted Hopp的解决方案,它工作得非常好,也可以使用番石榴的解决方案,如下所示:

ListMultimap<ListKeyType,Object> myMap = ArrayListMultimap.create();

...add function

myMap.put(myListKey, myObjectToAdd);
ListMultimap myMap=ArrayListMultimap.create();
…添加功能
myMap.put(myListKey,myObjectToAdd);
我会选择Ted的答案,只是将这个答案添加到另一个选项中


此外,编撰者“在他们的时代”喜欢番石榴

为什么要使用
hashCode()
作为键?那只是自找麻烦。是什么让你认为你当前的代码在复制一个列表?它只是获取一个引用。(您不需要在末尾使用
put
)时间来了解有关哈希代码和引用的更多信息,IMO.@almasshaikh-它不会抛出空指针异常,因为如果
tmp
null
,则在使用它之前会为它分配一个非
null
值。