2017-03-22 12 views
-1

이클립스 IDE에서 동시 HashMap으로 작업하고 있었고 동시 HashMap의 키를 변경하는 동안 출력이 변경된다는 사실을 알게되었습니다.
사례 I :
왜 키 값을 변경하면 동시 Hashmap에서 출력이 변경됩니까?

public static void main(String[] args) {  
    ConcurrentHashMap<String, String> concurrentHashMap= new ConcurrentHashMap<String, String>(); 
    concurrentHashMap.put("Fav Rap", "Eminem"); 
    concurrentHashMap.put("Fav Food", "Pizza"); 
    concurrentHashMap.put("Pop", "Jackson"); 

    for(Map.Entry<String, String> entry : concurrentHashMap.entrySet()){ 
     concurrentHashMap.put("Fav Game", "Fifa"); 
     concurrentHashMap.put("student", "smith"); 

     System.out.println("Key : "+entry.getKey()+", Value : "+entry.getValue()+" hashcode: "+entry.hashCode()+" size: "+concurrentHashMap.size()); 
    } 

} 

출력은 다음과 같습니다

키 : 팝, 값 : 잭슨의 해시 코드 : -172386558 크기 : 5

키 : 즐겨 찾기 랩, 값 : 에미넴의 해시 코드 : 1491542025 크기 : 5

키 : 학생, 값 : smith 해시 코드 : -1988544968 크기 : 5

,

키 : 즐겨 찾기 게임, 값 : 피파 해시 코드 : 1043213001 크기 : 5

키 : 즐겨 찾기 음식, 값 : 피자 해시 코드 : 983035627 크기 : 5

사례 II :

public static void main(String[] args) { 
    ConcurrentHashMap<String, String> concurrentHashMap= new ConcurrentHashMap<String, String>(); 
    concurrentHashMap.put("Fav1 Rap", "Eminem"); 
    concurrentHashMap.put("Fav Food", "Pizza"); 
    concurrentHashMap.put("Pop", "Jackson"); 

    for(Map.Entry<String, String> entry : concurrentHashMap.entrySet()){ 
     concurrentHashMap.put("Fav Game", "Fifa"); 
     concurrentHashMap.put("student", "smith"); 
     System.out.println("Key : "+entry.getKey()+", Value : "+entry.getValue()+" hashcode: "+entry.hashCode()+" size: "+concurrentHashMap.size()); 
    } 

} 

출력 입니다 :

키 : 팝, 값 : 잭슨의 해시 코드 : -172386558 크기 : 5

키 : Fav1 랩, 값 : 에미넴의 해시 코드 : 11578 29,666 크기 :

5 키 : 즐겨 찾기 음식, 값 : 피자 해시 코드 : 983035627 크기 : 5

난 그냥 Fav1 출력 변화에 즐겨 찾기에서지도의 첫 번째 키를 변경했습니다. 의심의 여지가 있습니까? 미리 감사드립니다 :)

+0

왜냐하면 fav 랩과 fav1 랩이 다른 개체이기 때문입니다. 그 이유는 방금 키의 이름을 변경 했는데도 여전히 새로운 객체를 만드는 것입니다. –

+0

코드의 현재 항목에 대한 키가 변경되지 않습니다. 기본적으로지도에 2 개의 항목을 추가하는 것입니다. – imprezzeb

+0

@ Mr.Aw 나는 Fav1 랩의 새로운 대상을 만들 것이라는 데 동의한다. 그러나 Fav Game과 학생이라는 다른 두 항목에는 어떤 일이 발생합니다. 목록의 크기는 5이지만 데이터 표시 횟수는 3입니다. 내 관심사를 이해 하셨 으면합니다. –

답변

2

이것은 동시 해시지도가 작동하는 방식입니다. 모든 값을 추가 한 후 살펴 본다면 출력은 동일합니다. iterating하는 동안 iterator에서 객체 참조에 따라 대소 문자가 달라지는 항목을 추가합니다. ConcurrentHashMap의에서 (GET 포함)

+0

케이스 II의 예리한 부분은 Fav Rap (case I)를 Fav1 Rap (사례 II)로 변경했습니다. 승인. 이제 Fav1 Rap을위한 새로운 객체를 만듭니다. 그러나지도를 표시하는 동안지도의 크기가 두 번째 경우에는 5 인 것처럼 보이지만 왜 3 개의 값만 인쇄됩니까? 당신이 내 걱정을 이해하기를 바랍니다. –

+0

이것은 3 개의 값으로 구성된지도의 entryset 객체를 반복하고지도 내용을 반복하는 동안 2 개의 추가 값을 추가했지만 entryset은 여전히 ​​현재 상태가 아니라 이전 상태를 가리키고 있기 때문입니다. – Aditya

+0

사례 I은 어떻습니까? 나는 또한 동일한 entryset 개체 iterating 경우에도 있지만 모든 5 값을 인쇄합니다. Fav Rap에서 Fav1 Rap로 키 (String)를 변경할 때만 3 개의 값을 표시 한 후 루프를 종료하지만 맵의 크기는 여전히 5입니다. 감사합니다. –

0

검색 작업은 차단하지 않기 때문에 업데이트 작업에 중복 (귀하의 경우 같이 넣어 (포함) 및 제거) 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 케이스 II에서 keelly see를 보면 나는 Fav Rap (케이스 I)에서 Fav1 Rap (케이스 II)로 키를 변경하고 있습니다. 승인. 이제 Fav1 Rap을위한 새로운 객체를 만듭니다. 그러나 왜 표시하는 동안 크기가 두 번째 경우에는 5 인 것처럼 보이지만 3 개의 값만 인쇄합니다. 당신이 내 걱정을 이해하기를 바랍니다. –

0

저는 프로젝트를 다시 컴파일해야한다고 생각합니다. 내 IDE에서 코드를 시도했기 때문에. 잘 돌아갔다. 그것은 저에게 케이스 I에 다만 5 개의 산출을 주었다. 여기에 내가 Fav Rap을 Fav1 Rap로 바꿨을 때의 나의 결과.

Key : Fav Food, Value : Pizza hashcode: 983035627 size: 5 
    Key : Pop, Value : Jackson hashcode: -172386558 size: 5 
    Key : Fav1 Rap, Value : Eminem hashcode: 1157829666 size: 5 
    Key : Fav Game, Value : Fifa hashcode: 1043213001 size: 5 
    Key : student, Value : smith hashcode: -1988544968 size: 5 
+0

아 !!! IDE 일식 일하고 있었는데. 어쨌든 고마워. 나는 식으로 일하는 동안 뭐가 잘못 됐는지 알아 내야 해. –

+0

도움이 되었습니까? 내 대답을 확인하고 투표를 통해 평판을 얻도록 도와 줄 수 있습니까? 하하. –