Java:将元素添加到HashMap内的列表中
我想知道是否有更有效的方法将元素添加到hashmap中的列表中,而不是复制列表,将元素添加到copylist中,然后使用与列表关联的特定键在映射中放置,以覆盖该映射部分位置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();
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
值。