三元运算符执行方法

时间:2014-12-20 14:09:00

标签: java ternary-operator

我有一个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)

3 个答案:

答案 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);