2014-12-20 7 views
3

나는 HashMap<Foo,ArrayList<Bar>>을 가지고 있는데, ArrayList이 키와 연결될 때 그 값을 추가하려고합니다.메서드의 삼항 연산자 실행

삼항 연산자는

하게 내가 현재 키 푸에 연관된 값이 null 인 경우 그 다음 새로운 ArrayList에 내가 그것을 원하는 것을 추가하고로 그것을 다시 넣어 경우, 확인하고 있습니다하고 있어요 지도. 그렇지 않다면 arrayList를 저장하여 원하는 곳에 추가하고 다시 map에 다시 넣습니다.

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)을 실행합니까? 아니면 자바 컴파일러가 똑똑하고 단 한 번만 평가합니까? (실행 속도 측면에서 보면 약간의 차이가 있음을 알고 있지만 예제 1을 사용하기 시작한 이유는 충분합니다.)

+0

사용 구아바 multimap은 대신 : https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#Multimap 당신이'은 javap를 사용하여 바이트 코드를 조사 할 수 – eiden

+0

-c com.mypackage.MyClass'를 사용하면 어떤 일이 일어나는지 볼 수 있습니다. – wvdz

+0

그래서'map.get (key)'의 결과에 임시 변수를 사용하는 대신 선호하는 삼항 연산자 대신 첫 번째 코드를 사용하는 것이 더 낫습니까? – Tom

답변

3

다음은 불필요하게 사용하지 않으므로 다음과 같습니다. 목록지도에 이미있는 경우 풋 전화 :

List<Bar> valuesList = map.get(key); 
if(valuesList == null){ 
    valuesList = new ArrayList<Bar>(); 
    map.put(key,valuesList); 
} 
valuesList.add(Item); 

참고,이 훨씬 더 읽을 수 삼항 연산자 (코드 적은 라인, 반드시 이럴 간단하지 않다) 사용하는 것보다 찾을 수 있습니다. 지도의 크기에 따라 불필요한 호출 (get 및 put)을 절약하는 것이 쉽지 않을 수 있습니다.

2

바이트 코드를 조사하면 get() 메소드가 실제로 두 번째 코드 스 니펫에서 두 번 호출된다는 것을 알 수 있습니다. 이론적으로지도가 호출간에 변경되어 이것이 최적화 될 수 없을 수도 있습니다.

참고 : map.put() 호출은 객체를 수정하면지도에서 저장된 객체를 자동으로 변경하므로 호출이 중복됩니다. 지도에서 사본을 가져 오지 않으면지도에서 객체에 대한 참조를 가져옵니다.

1

map.get (key)를 변수에 전달한 다음 3 진 연산자에서 사용하지 않는 이유는 무엇입니까?

당신은 할 수 :

Object value = map.get(key); 
ArrayList<Bar> valuesList = (value == null) ? new ArrayList<Bar>() : value; 
valuesList.add(Item); 
map.put(Foo,valuesList);