2015-01-12 3 views
2

이상한 결과가 나왔고 설명 할 수 없습니다. 나는 sysos에서잘못된 목록을 가져 오는 이유는 무엇입니까?

> {Level=1 - Normal, Name=IT/Java} 
> {Level=2 - Medium, Name=IT/Ruby} 
> [{Level=2 - Medium, Name=IT/Ruby}, {Level=2 - Medium, Name=IT/Ruby}] 

을받을 이유 , 당신은 아이디어가 있습니까? 실제로

> {Level=1 - Normal, Name=IT/Java} 
> {Level=2 - Medium, Name=IT/Ruby} 
> [{Level=1 - Normal, Name=IT/Java}, {Level=2 - Medium, Name=IT/Ruby}] 

해야 할 때 여기 내 코드입니다.

public List<Map<String, Object>> getMapsforTables() { 
     levelList = this.getSkilllevel(); 
     description = this.getSkillnames(); 
     Map<String, Object> rm = new HashMap<String, Object>(); 
     List<Map<String, Object>> l = new LinkedList<Map<String, Object>>(); 

     for(int i=0; i < levelList.size(); i++){ 
      rm.clear(); 
      rm.put("Name", description.get(i)); 
      rm.put("Level", levelList.get(i)); 
      System.out.println(rm); 
      l.add(rm); 
     } 
     System.out.println(l); 
     return l; 
    } 
+4

오브젝트와 참조가 무엇인지 배우십시오. 오브젝트를 다른 오브젝트에 배치하는 동안 오브젝트를 계속 변경하고 이후에 오브젝트가 변경된다는 점을 알아 두십시오. – Smutje

답변

2

무엇 일어나는 것은 당신이 List에 요소를 추가 할 때 :

l.add(rm); 

당신이 개체에 대한 참조를 추가합니다.

다음 반복에서는 rm이 참조하는 개체를 수정하고 다시 추가합니다. 따라서 동일한 참조를 두 번 추가했습니다.

무엇을 할 수 있습니까?

간단한 해결 방법은 루프 내에서 rm를 선언하는 것입니다 :

for(int i=0; i < levelList.size(); i++){ 
    Map<String, Object> rm = new HashMap<String, Object>(); 
    ... 
} 
5

각 반복마다 동일한 개체를 수정하여 목록에 추가하기 때문에. 당신은 할 수 :

for(int i = 0; i < levelList.size(); i++){ 
    Map<String, Object> rm = new HashMap<String, Object>(); 
    rm.put("Name", description.get(i)); 
    rm.put("Level", levelList.get(i)); 
    System.out.println(rm); 
    l.add(rm); 
} 
3

짧은 버전이 있기 때문에 계속해서 또 다시 같은 Map 개체를 다시 사용합니다.

첫 번째 문으로 for 루프 내에서 Map<String, Object> rm = new HashMap<String, Object>(); 행을 이동하면 문제가 없어집니다.

장기적으로는 참조 전달과 값 전달의 차이점에 대한 일반 CS 또는 Java 자습서를 살펴야합니다.

관련 문제