Java 方法的三元运算符执行

Java 方法的三元运算符执行,java,ternary-operator,Java,Ternary Operator,我有一个HashMap,当我得到一个键关联的ArrayList并向它添加一些值时,我想要这个 三元运算符使 我目前正在做的是检查与键Foo关联的值是否为null,如果为null,则创建一个新的ArrayList将我想要的添加到其中并将其放回映射中。如果没有,我存储他们的arrayList添加我想要的内容,然后再次将其放回地图中 我可以这样做: ArrayList<Bar> valuesList = map.get(key); if(valuesList == null){ v

我有一个
HashMap
,当我得到一个键关联的
ArrayList
并向它添加一些值时,我想要这个

三元运算符使

我目前正在做的是检查与键Foo关联的值是否为null,如果为null,则创建一个新的ArrayList将我想要的添加到其中并将其放回映射中。如果没有,我存储他们的arrayList添加我想要的内容,然后再次将其放回地图中

我可以这样做:

ArrayList<Bar> valuesList = map.get(key);
if(valuesList == null){
    valuesList = new ArrayList<Bar>;
}
valuesList.add(Item);
map.put(Foo,valuesList);
arraylistvalueslist=map.get(键);
if(valuesList==null){
valuesList=新的ArrayList;
}
增加价值清单(项目);
地图放置(Foo,valuesList);
但我更喜欢使用三元运算符来缩短代码:

ArrayList<Bar> valuesList= (map.get(key) == null) ? new ArrayList<Bar>() : map.get(key);
valuesList.add(Item);
map.put(Foo,valuesList);
arraylistvalueslist=(map.get(key)==null)?新建ArrayList():map.get(键);
增加价值清单(项目);
地图放置(Foo,valuesList);

我的问题是,(在第二个)示例中,我是否执行了两次
map.get(key)
?还是Java编译器很聪明,只对它进行一次评估?(我知道它在执行速度方面有微小的差别,但如果它执行两次,我就有足够的理由开始使用示例1)

以下是我将使用的,因为如果列表已经在地图中,您也不会不必要地调用put:

List<Bar> valuesList = map.get(key);
if(valuesList == null){
    valuesList = new ArrayList<Bar>();
     map.put(key,valuesList);
}
valuesList.add(Item);
List valuesList=map.get(键);
if(valuesList==null){
valuesList=新的ArrayList();
地图放置(键、值列表);
}
增加价值清单(项目);

注意,我发现这比使用三元运算符可读性好得多(IMHO,代码行数越少并不一定越简单)。根据地图的大小,节省不必要的调用(get和put)可能不是一件小事

研究字节码会发现get()方法实际上在第二个代码段中被调用了两次。从理论上讲,映射可能会在调用之间发生变化,因此无法对其进行优化


另一方面,您的调用map.put()是多余的,因为通过修改对象,您将自动更改映射中存储的对象。不是从映射中提取副本,而是从映射中提取对对象的引用。

为什么不传递映射。获取(键)变量,然后将其与三元运算符一起使用

你可以做:

Object value = map.get(key);
ArrayList<Bar> valuesList = (value == null) ? new ArrayList<Bar>() : value;
valuesList.add(Item);
map.put(Foo,valuesList);
Object value=map.get(键);
ArrayList valuesList=(值==null)?新建ArrayList():值;
增加价值清单(项目);
地图放置(Foo,valuesList);

改用guava multimap:您可以通过使用
javap-c com.mypackage.MyClass
来研究字节码,看看引擎盖下发生了什么。因此,不要对
map.get(key)
的结果使用临时变量,您更可能使用第一个代码而不是首选的三元运算符?如果您使用Java 8,则可以使用
map.computeIfAbsent(key,ArrayList::new)