Во-первых, вы никогда не устанавливаете объект на нуль. Эта концепция не имеет смысла. Вы можете присвоить значение null
переменной , но вам нужно очень тщательно различать понятия «переменная» и «объект». Как только вы это сделаете, ваш вопрос будет отвечать самим образом:
Теперь с точки зрения «мелкой копии» и «глубокой копии» - здесь, вероятно, стоит избегать термина «мелкая копия», так как обычно мелкая копия включает в себя создание новый объект, но просто копирование полей существующего объекта напрямую. Глубокая копия возьмет копию объектов, на которые ссылаются эти поля (для полей ссылочного типа). Простое назначение так:
ArrayList<String> list1 = new ArrayList<String>();
ArrayList<String> list2 = list1;
... не делает либо неполную копию или глубокой копии в этом смысле. Он просто копирует ссылку. После вышеописанного кода list1
и list2
являются независимыми переменными - в действительности они имеют одинаковые значения (ссылки) на данный момент. Мы могли бы изменить значение одного из них, и это не будет влиять на других:
list1 = null;
System.out.println(list2.size()); // Just prints 0
Теперь, если вместо изменения переменных, мы делаем изменения в объект, значения переменных относятся к , что изменения будут видны через другой переменной тоже:
list2.add("Foo");
System.out.println(list1.get(0)); // Prints Foo
Итак, вернемся к первоначальному вопросу - вы никогда не храните реальные объекты в карте, список, массив и т.д. вы только когда-либо хранить ссылки.Объект может быть собран только при сборке мусора, если нет никакого способа «живого» кода, достигающего этого объекта. Так что в этом случае:
List<String> list = new ArrayList<String>();
Map<String, List<String>> map = new HashMap<String, List<String>>();
map.put("Foo", list);
list = null;
... ArrayList
объект до сих пор не может быть мусора, потому что Map
есть запись, которая относится к нему.
Я всегда находил один из наиболее привлекательных аспектов Java сборщик мусора ... –