2013-04-10 32 views
1

在JAVA中,我有一个HashMap,其中“Player”对象为Keys,“ArrayList”为值。它用于存储每个玩家的对手。指向hashmap的变量称为playerOpponents。是否有必要在编辑后重新将集合重新放入另一个集合中?

现在我想为对手添加一个对手。是否有必要在方法1中编辑之后将列表放在地图中,或者不像方法2中那样?

方法一:

private void addOpponent(Player p, Player opponent) 
{ 
    ArrayList<Player> allOpponents = playerOpponents.get(p); 
    allOpponents.add(opponent); 
    playerOpponents.put(p,allOpponents); 
} 

方法2:

private void addOpponent(Player p, Player opponent) 
{ 
    ArrayList<Player> allOpponents = playerOpponents.get(p); 
    allOpponents.add(opponent); 
} 
+2

你不需要重新将它添加到散列表。当你做'.get()'的时候,你会回到对象的引用。 – 2013-04-10 17:43:41

回答

1

没有。既然HashMap已经有这个清单了,你只需要get那个参考不是remove吧,所以不需要再加它。只需将该元素添加到现有列表。而已。

1

HashMaps像所有其他收藏店Object参考。您对Map中的对象所做的任何更改都会立即反映在由HashMap#get返回的Object中,因为它们是相同的对象

0

这样做,这将是最简洁的方式:

playerOpponents.get(p).add(opponent); 
1

这是没有必要重新把该对象。您的get声明所做的是检索对ArrayList的引用,而不是ArrayList的副本。

再举一个例子,说你这样做:

ArrayList a = playerOpponents.get(p); 
ArrayList b = playerOpponents.get(p); 

a所做的任何更改将反映在b,反之亦然。在你的情况下,a是从HashMap采用get方法检索的ArrayList参考,而b是参考HashMap中的ArrayList。另一个参考的变化反映在另一个参考中。

3

不需要每次都放列表引用。只要把null检查。

private void addOpponent(Player p, Player opponent){ 
    List<Player> allOpponents = playerOpponents.get(p); 
    if(playerOpponents.get(p)==null){ 
     allOpponents = new ArrayList<>(); 
     allOpponents.add(opponent); 
     playerOpponents.put(p,allOpponents); 
    }else 
     allOpponents.add(opponent); 
} 
+0

感谢您提醒检查arrayList是否为空。 – user1884155 2013-04-10 17:50:33

0

否。playerOpponent从Player p映射引用的ArrayList将包含“对手”,不包含任何其他函数调用。

0

没关系,不需要重新放置它,因为您只是更改键值映射的值。

但是,要注意一个微妙的问题:如果您曾经以某种影响其equals()或hashCode()方法的方式更改KEY,换句话说就是Player实例,那么您的地图可能会被皇室弄乱向上。如果您使用默认的equals()和hashCode()实现,那么更改播放器中的任何字段将会搞砸地图。

在后一种情况下,您需要在更改之前将其删除,并在更改后重新放置它,以便它可以正确散列到其新的散列位置。或者可能更简单,只需重写Player类的hashCode()和equals()方法即可仅考虑Player的一些不可变字段,例如playerId;那么你可以自由地使用它,而不必删除或重新放置(只要该不可变字段永远为空)。

相关问题