2014-01-30 4 views
3

Может ли кто-нибудь объяснить мне, почему этот фрагмент кода работает?преобразование списка в массив фиксированного размера

Object[] op = new Object[0]; 

ArrayList r = new ArrayList(); 
r.add("1"); 
r.add("3"); 
r.add("5"); 
r.add("6"); 
r.add("8"); 
r.add("10"); 

op = r.toArray(); 
System.out.println(op[3]); 

Это печатает 6. Я знаю, что вы можете преобразовать список в массив, но я думал, что если массив фиксированного размера, то вы не можете добавить дополнительные элементы. В этом случае массив op имеет фиксированный размер «0», поэтому почему/как элементы списка добавляются в массив? Благодаря

ответ

6

Вы должны различать между ссылкой на ваш объект массива (то есть Object[] op) и фактической объекта массива в котором опорные точки.

С

Object[] op = new Object[0]; 

вы создаете массив размером 0 и назначить его на op ссылки.

Но затем, с

op = r.toArray(); 

вы присваиваете новый объект массива в op ссылки. Этот новый объект массива был создан методом toArray() с соответствующим размером.

Более ранний объект массива, который был создан с помощью new Object[0];, теперь свисает и подвергается сбору мусора.

+0

о, да. Я полностью забыл, что переменные массива также являются ссылочными переменными. благодаря – user3149650

1

По той же причине, что этот код печатает X вместо ABC:

String s = "ABC"; 
String t = "XYZ"; 
s = t.substring(0, 1); 
System.out.println(s); 

Вы переназначить значение оп, и новое значение не имеет ничего общего со старым значением.

1

Вы неправильно поняли одну важную вещь здесь. Идентификаторы Java являются только указателями на объекты, а не сами объекты.

Вот когда вы

Object[] op = new Object[0]; 

создать новый массив экземпляра с фиксированным размером 0, и вы указать идентификатор «оп» к нему.

Но когда вы позже сделать

op = r.toArray(); 

просто перезаписать, где ваш бывший идентификатор точки в. Вы теряете ссылку на свой первый массив, который будет собран в мусор. «op» desgin теперь новый массив, ваш бывший просто исчезает.

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