ArrayList에 개체를 추가하고 나중에 수정


80

ArrayList가 있고 여기에 개체를 추가하고 나중에이 개체를 수정 한 경우이 변경 사항이 ArrayList에 반영됩니까? 또는 ArrayList에 객체를 추가하면 Java가 복사본을 만들어 ArrayList에 추가합니까?

이 개체에 대한 참조를 null로 변경하면 어떻게됩니까? 그것은 ArrayList의 객체도 이제 null을 의미합니까?


1
이 질문 (& 답변)은 정말 북마크 할 가치가 있습니다!
Terry

내가 물어 보려고했던 모든 질문들 :)
navid dec.

답변:


84

이 변경 사항이 ArrayList에 반영됩니까?

예, 목록에있는 개체에 대한 참조 를 추가했기 때문 입니다. 추가 한 참조는 여전히 수정 한 동일한 객체를 가리 킵니다.


또는 ArrayList에 객체를 추가하면 Java가 복사본을 만들어 ArrayList에 추가합니까?

아니요, 개체를 복사하지 않습니다. (객체에 대한 참조를 복사합니다.)


이 개체에 대한 참조를 null로 변경하면 어떻게됩니까? 그것은 ArrayList의 객체도 이제 null을 의미합니까?

아니요, 목록에 추가 될 때 원본 참조의 내용이 복사 되었기 때문 입니다. ( 객체가 아니라 복사 되는 참조 임을 명심하십시오 .)

데모:

StringBuffer sb = new StringBuffer("foo");

List<StringBuffer> list = new ArrayList<StringBuffer>();
list.add(sb);

System.out.println(list);   // prints [foo]
sb.append("bar");

System.out.println(list);   // prints [foobar]

sb = null;

System.out.println(list);   // still prints [foobar]

이것에 대해 : 버튼 a = 새 버튼; 버튼 b = 새 버튼; 버튼 전류 = a; List.add (현재); 전류 = b; 목록 내용을 인쇄하면 "a"또는 "b"가됩니까?
Lorenzo Sciuto 2013 년

1
@aioobe 귀하의 답변은 게시물의 첫 번째 지점에서 객체에 대한 참조가 복사 (이 경우 '현재') 된 다음 a에서 b로 변경된다는 내용과 충돌하는 것 같습니다. 나는 그것이 b를 인쇄한다고 예상했을 것입니다. 자세히 설명해 주시겠습니까?
Jan K.

2
Java는 항상 값으로 전달되며 (특히 객체에 대한 참조는 값으로 전달됨) 모두 명확해야합니다.
aioobe

이것은 a를 추가하고 String변경 하는 경우가 아닌 것 같습니다 . 즉String a = "first"; list.add(a); a = "second"; ...print(list.get(0)) // "first"
Don Cheadle

나는 당신이 무엇을 의미하는지 명확히 할 수 있습니다 생각 pass by value그것은 당신 값이 발송되었습니다로 변경할 수 없습니다 전송 있었는지, 참조가 아닌 뭔가 암시하는 것 같다으로
돈 치들

5

개체에 대한 모든 변경 사항이 목록에 반영됩니다.

그러나 변경 불가능한 문자열과 같은 객체를 다룰 때 "변경 작업"시 새 객체가 생성됩니다. 실제로 이전 개체는 다른 곳에서 새 개체를 얻는 동안 여전히 목록에 있습니다.


이것은 매우 중요한 차이점이다
돈 치들

1

여러분 모두 감사합니다. 나는 당신의 게시물을 읽음으로써 다시 그것을 알아 냈습니다. 오래전에 소화해 봤지만 최근에 어떻게 작동하는지 잊어 버렸기 때문에 혼란 스러울 것입니다. 그래서 저는 저를 위해 문제를 해결하는 열쇠를 공유하고 싶습니다. (Java의 비 원시 객체 (프리미티브는 int, boolean 등)는 기술적으로 포인터입니다). u는 추가하면 O를 개체를 목록, 목록과에 같은 일을 점 유 수정할 때 너무 O를 목록의 항목이 변경. 이것은 그들이 같은 것을 가리키고 o가 =에 의해 다른 것을 가리킬 때 끊어지는 한입니다 .

o = null;   //o points to nothing and changes in o from now on doesn't effect the list's item

또는

Object a = new Object();
o = a;    //o and the list's item don't point to same thing so changes in o doesn't effect the list's item (but it effects a)

누군가에게 도움이되기를 바랍니다


-1

ArrayList가 값으로 Map 내부에있는 또 다른 데모를 추가하려고합니다. ArrayList는 Map에 추가 한 후 수정되며 Map은 변경 사항을 반영합니다.

지도에는 어머니의 이름을 키로, 자식을 값으로하는 요소가 하나 있습니다.

    String key = "adeleMom";
    Map<String, ArrayList<String>> myMap = new HashMap<String, ArrayList<String>>();
    ArrayList<String> firstList = new ArrayList<String>();
    firstList.add("adele");
    myMap.put(key, firstList);
    firstList = null;
    ArrayList secondList = myMap.get(key);
    System.out.println(secondList); // prints [adele]
    secondList.add("bonnie");
    System.out.println("Added bonnie");
    ArrayList thirdList = myMap.get(key);
    System.out.println(thirdList); // prints [adele, bonnie]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.