2016-07-20 5 views
0

문제가 생겼습니다.새 연산자를 사용하면 Original ArrayList가 변경됩니다.

List<List<Integer>> result = new ArrayList<>(); 
result.add(new ArrayList<>()); 
List<List<Integer>> temp = new ArrayList<>(); 
for (List<Integer> list: result) { 
    list.add(10000); 
    temp.add(new ArrayList(list)); 
} 

나는 결과가 [[10000]]로 밝혀 이유를 알고뿐만 아니라하지 않는다 : 나는 다음과 같은 코드에서 임시을 변경하려고하면서 결과가 업데이트됩니다 (나는 결과에 아무것도하지 않았다) 임시 직원. temp.add (new ArrayList (list))와 같은 add 메소드에 문제가 있습니까?

답변

0

작성된 코드는 한 번만 반복됩니다. 이제 살펴 보자 : 이것은 요소가 List<Integer>를됩니다 List, 인, result를 초기화

List<List<Integer>> result = new ArrayList<>(); 
result.add(new ArrayList<>()); 

. 그런 다음 결과에 하나의 요소를 추가하므로 result은 단일 요소 목록입니다. 그 한 요소는 그 자체로 제로 요소 목록입니다. 여기

List<List<Integer>> temp = new ArrayList<>(); 

, 당신은 temp은 또한 요소 유형으로 List<Integer>을 포함하는 List로 초기화하지만 빈입니다.

for (List<Integer> list: result) { 
    list.add(10000); 
    temp.add(new ArrayList(list)); 
} 

여기에서 result에는 요소가 하나만 있습니다. 그 하나의 요소는 당신이 줄 2에 준 물건입니다. result.add(new ArrayList<>());입니다. 이 루프는 result의 각 요소를 반복하며 result에는 요소가 하나만 있기 때문에 루프가 한 번만 반복됩니다.

이 경우 result의 첫 번째 요소는 빈 목록이 아닌 10000이 포함 된 목록으로 업데이트됩니다. 따라서 result은 여전히 ​​싱글 톤 목록이지만, 그 하나의 요소는 이제 10000을 포함하는 싱글 톤 목록이 될 것입니다.

그런 다음 temp.add(new ArrayList(list))으로 전화하십시오. new ArrayList(list)을 호출하면 list이 수행하는 모든 요소가 포함 된 ArrayList이 생성됩니다. 전화를 걸 때 list10000을 포함하는 싱글 톤이므로 new ArrayList(list)은 숫자가 10000 인 싱글 톤입니다. 그런 다음 이전에 빈 목록이었던 ArrayListtemp에 추가합니다. 이제 temp은 싱글 톤이며 하나의 요소는 10000을 포함하는 싱글 톤 목록입니다.

이 시점에서 resulttemp은 모두 정확하게 하나의 요소를 포함하는 목록이며 각 요소는 정확히 하나의 요소를 포함하는 목록이며 숫자는 10000입니다. 따라서 과 temp의 값은 입니다. 여기에서 [10000]은 숫자가 10000 인 목록이고 [[10000]][10000] 인 목록입니다.

관련 문제