2016-08-11 2 views
-7

DB의 데이터를 저장하는 HashMap이 있습니다. 사용자가 반드시 iterate에 대한 참조를 생성해야합니까?Java Collection - Reference

Map<String, List<Employee>> **map** = Cache.getMap(key); 

for(Map.Entry<String, List<Employee>> me: map.entrySet()){ 

또는 20 개 스레드의

for(Map<String, List<Employee>> me : Cache.getMap(key)){ 

최소 특정 시점에서 캐시를 치는 것입니다. 각 발신자는지도에서 데이터 처리를 완료하는 데 약 500 밀리 초가 걸립니다.

이는 GC와 속도 관점에서 볼 때 위의 두 가지 옵션 중 더 나은 옵션입니다.

또는 위에 언급 한 옵션보다 더 좋은 옵션이 있습니까?

+0

클래스를 로컬로 생성하고 시스템 또는 환경에서 메트릭을 가져옵니다. 좋은 운동을 대체하는 것은 없습니다. – randominstanceOfLivingThing

+0

"참조 만들기"와 같은 것은 없습니다. 첫 번째 변종에서는 두 경우 모두 존재하는 참조를 보유 할 변수를 도입하고 있습니다. 코드가하는 일에는 아무런 영향을 미치지 않습니다. 두 번째 변형의 잘못된 구문을 수정하면 결과가 동일합니다. – Holger

답변

0

당신은 쓰기 여부

IterableOrArray all=expression; 
for(ElementType element: all) { 
    … 
} 

또는

이 두 경우 모두 같은 차이를하지 않습니다 는 expression 루프의 시작 부분이 아니라 각 반복에 한 번만 평가됩니다

for(ElementType element: expression) { 
    … 
} 
. Iterable의 경우 결과 코드가 어떻게 표현식을 재평가하고 새로운 Iterator에 이전 코드의 이전 위치에서 재개 할 수 있는지 상상하기 어렵습니다.

여전히 의심하는 경우에는 다음 예제 프로그램을 확인할 수 있습니다

public static void main(String[] args) { 
    for(String s: getTheCollection()) { 
     System.out.println(s); 
    } 
} 
static Iterable<String> getTheCollection() { 
    System.out.println("getTheCollection() called"); 
    return() -> { 
     System.out.println("iterator() called"); 
     return Stream.of("foo", "bar", "baz").iterator(); 
    }; 
} 

정도의 차이는 GC와 아무런 차이가 없다, 전혀 존재하지 않기 때문에

public static void main(String[] args) { 
    String[] array={ "foo", "bar", "baz" }; 
    for(String s: array) { 
     System.out.println(s); 
     // has no consequences: 
     array=null; 
    } 
} 

속도 관점.

관련 문제