2014-10-19 2 views
0

Рассмотрим следующий код:Java ArrayList ясно или возобновляем

import java.util.ArrayList; 
public class Main{ 
    public static void main(String args[]){ 
     ArrayList<ArrayList<Integer>> test = new ArrayList<ArrayList<Integer>>(); 
     ArrayList<Integer> a = new ArrayList<Integer>(); 
     a.add(7); 
     test.add(a); 
     System.out.println(test); 
     a.clear() 
     System.out.println(test); 
    } 
} 

Выход теста будет отличаться друг от друга (Один [[7]], а другой [[]]) Если мы используем = новый ArrayList() вместо a.clear(), результат будет другим. Я думал, что «тест» уже записал «а», поэтому я могу сделать что-нибудь о «а» без изменения «теста». Кто-нибудь может сказать мне, что произойдет, когда я использую a.clear() и исправлю свою мысль? Благодарю.

ответ

1

Я думал, что «тест» уже записал «а», поэтому я могу сделать что-нибудь о «а» без изменения «теста».

Это записано a, сохраняя ссылку на тот же объект, который держит a. Когда вы делаете

a.clear() 

вы вызов clear метода этот же объект.

+0

Как сохранить значение вместо ссылки? Я имею в виду, если я изменил «a» на a.add (4); Весь «тест» изменился. Но я надеюсь, что тест останется прежним. Что мне делать? – Pugna

+0

@ Пугна Ты не можешь. Значение переменной является ссылкой на объект, а не на объект. 'a.add (4)' все еще добавляет к объекту, на который ссылается 'a'. Если вы хотите добавить в другой/новый список, создайте его и назначьте ссылку на него 'a'. –

0

a.clear() удаляет все данные внутри списка. Он непосредственно воздействует на объект a и его данные. a = new ArrayList() создаст новый ArrayList и назначит его ссылку на переменную a. Поскольку test хранит старую ссылку, результат остается [[7]]

Смежные вопросы