我有一个HashMap<Foo,ArrayList<Bar>>
,当我将ArrayList
与某个关键字相关联并为其添加一些值时,我希望这样做。
三元运算符
我目前正在做的是检查与密钥Foo相关联的值是否为空,如果是,则将新的ArrayList添加到我想要的内容并将其放回到地图中。如果没有,我存储他们arrayList添加我想要的东西,然后再把它放回地图。
我可以这样做:
ArrayList<Bar> valuesList = map.get(key);
if(valuesList == null){
valuesList = new ArrayList<Bar>;
}
valuesList.add(Item);
map.put(Foo,valuesList);
但我更喜欢使用三元运算符来缩短代码:
ArrayList<Bar> valuesList= (map.get(key) == null) ? new ArrayList<Bar>() : map.get(key);
valuesList.add(Item);
map.put(Foo,valuesList);
我的问题是,(在第二个)例子中,我执行map.get(key)
两次?或者Java编译器是否很聪明并只评估一次? (我知道它在执行速度方面存在细微差别,但如果它执行两次,这足以让我开始使用示例1)
答案 0 :(得分:3)
以下是我使用的内容,因为如果列表已经在您的地图中,您也不会不必要地调用put:
List<Bar> valuesList = map.get(key);
if(valuesList == null){
valuesList = new ArrayList<Bar>();
map.put(key,valuesList);
}
valuesList.add(Item);
注意,我发现这比使用三元运算符更具可读性(代码行不一定更简单,恕我直言)。根据地图的大小,节省不必要的电话(获取和放置)可能并不简单。
答案 1 :(得分:2)
调查字节码可以了解到,在第二个代码段中,get()方法实际上被调用了两次。理论上,地图可能会在调用之间发生变化,因此无法进行优化。
旁注:您的调用map.put()是多余的,因为通过修改对象,您将自动更改地图中存储的对象。你没有从地图中提取副本,而是从地图中提取对象的引用。
答案 2 :(得分:1)
为什么不将map.get(key)传递给变量,然后将其与三元运算符一起使用?
你可以这样做:
Object value = map.get(key);
ArrayList<Bar> valuesList = (value == null) ? new ArrayList<Bar>() : value;
valuesList.add(Item);
map.put(Foo,valuesList);