2011-03-22 2 views
2

다음 코드 조각에서 dic.isEmpty()에 대한 검사 결과가 이되고 성능이 향상 되었습니까? 지도/DIC가 빈 상태 (empty)의 경우) dic.isEmpty (대한 점검과 같은 중복 그래서 결국Map.isEmpty()는 while (Iterator.hasNext()) 루프를 입력하기 전에 이해가됩니까?

for (Map<String, String> dic : dics) { 
     if (!dic.isEmpty()) { 
     Iterator<Map.Entry<String, String>> it = dic.entrySet().iterator(); 
     while (it.hasNext()) { 
      Map.Entry<String, String> pair = it.next(); 
      Log.d("Substitute", pair.getKey() + " => " + pair.getValue()); 
     } 
     } 
    } 

는 그동안() 루프는 입력되지 않습니다 - 몇 가지 다른 정당화가없는 그것?

답변

2

코드를 중간에 최적화하려고했습니다. 비어의 경우는, "아니오 항목"반복자를 다시 돌아

  1. 것은 같은 정적 "빈 상태 (empty)의 반복자를"다시 복귀 할 가능성이 높습니다 : 귀하의지도 중 하나를 항상 비어 있거나 비어 있지 될 것입니다

    (Collections.EmptyIterator)를 사용하여 메모리에 미치는 영향을 무시할 수 있습니다.

  2. 꽉 찼다면 필요한 반복기에 대한 액세스 속도가 느려질 것입니다.

다른 문제가 빈 체크와 반복자 잡기 사이에 항목을 추가하는 경우 주요 문제는 경쟁 조건이 발생할 수 있다는 것입니다. 즉, null 이터레이터를 반환하는 비용은 무시할 수 있습니다 (많은 튜닝 된 콜렉션이 싱글턴 null 반복자를 되 돌리므로), 여분의 체크는 과잉입니다.

+0

답장에 아무런 문제가 없지만 "다른 스레드가 항목을 삭제하고 빈 체크와 반복자를 가져 오는 사이에 빈 칸이 생기는 경우"를 의미 할 것입니다. – sactiw

+0

@sactiw 예. 내 말씨는 줄 사이의 읽기가 필요하고 "줄 사이"를 채워 주신 것에 감사드립니다. –

2

중복되어 있습니다. 나는 그것을 버려라. 이것은 조기 미세 최적화의 냄새를 맡 깁니다.

이 시나리오에서는 빈지도를 특별한 경우로 취급해서는 안되기 때문에 isEmpty은 코드 imo를 혼란스럽게합니다.

관련 문제