2017-01-26 1 views
1

Я думал, что это будет хорошим упражнением для понимания немного больше об объектах.Как ссылаться на объект Java снова после изменения исходной ссылочной переменной

Я пытаюсь выяснить, как ссылаться на объект снова после изменения исходной ссылочной переменной объекта.

Возьмет следующий код:

String person = "person a"; //Line 1 
person = "person b";  //Line 2 

Теперь линия 1 создает новый объект String, с задающим быть person. Строка 2 присваивает эту ссылочную переменную другому новому объекту String. У исходного объекта String теперь нет ссылочной переменной.

Как бы я обходил назад и ссылался на исходный объект String, который уже находится в памяти в строке 1? Скажем, присваивая ссылочную переменную person обратно исходному объекту String? Как последующая мысль (не то, что я знаю много о сборке мусора), но является ли исходным объектом, подходящим для сбора мусора, является то, что после строки 2 он не имеет ссылочной переменной и поэтому не имеет права ссылаться снова?

Я вижу метод hashCode(), а также System.identityHashCode(), но не могу понять, как его реализовать, чтобы снова ссылаться на исходный объект.

+1

Вы не можете. Сохраните предыдущее значение во временной переменной и получите доступ к нему. –

+2

'hashCode()' (и 'System.identityHashCode()') не предназначены для получения определенного объекта; его значение не может быть интерпретировано как адрес памяти. Хэш-код предназначен для определения того, являются ли два объекта определенно * не * равными. –

+0

@AndyTurner, так что если два объекта имеют один и тот же «хэш-код», мы не можем сказать, что у них одинаковый адрес памяти? –

ответ

3

Строка 3: person = "person a"; Java имеет String межсетевой экран. Теперь, если это не был String (или какой-то другой кешированный тип), ответ был бы у вас нет. Поскольку реферированный объект имеет право на сбор мусора (он больше не имеет ссылок). Вы можете подтвердить это как:

String person = "person a"; //Line 1 
System.out.println(person.hashCode()); 
person = "person b";  //Line 2 
person = "person a";  //Line 3 
System.out.println(person.hashCode()); 

который будет отображать один и тот же хэш-код дважды; потому что это тот же самый экземпляр.

+1

Итак, если String равен ранее созданному объекту String, он будет использовать только оригинальный объект, но с большинством других объектов вы просто теряете возможность использовать их снова, как только у них больше нет ссылочной переменной (или нет ссылочной переменной в первое место)? – aCarella

+0

Но важно отметить, что '' Aa "и' "BB" 'имеют один и тот же хэш-код; но они разные объекты. (И, конечно, '' Aa "и' new String ("Aa") 'имеют один и тот же хэш-код, но они тоже разные объекты). Хэш-код не может использоваться для «поиска» определенного объекта. –

0

После назначения новой строки

person = "person b"; 

Первый исчезает .. Вы не сможете использовать его, потому что вы потеряли свой адрес.