Когда две ссылки в Java указывают на один и тот же объект в памяти?

«Когда две ссылки в Java указывают на один и тот же объект в памяти?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Две ссылки указывают на один объект, когда они содержат одинаковый адрес памяти (значение ссылки). Это происходит в следующих случаях:

1. Прямое присваивание ссылки:

Object original = new Object(); // Создан объект, 'original' ссылается на него
Object copyOfReference = original; // 'copyOfReference' получает КОПИЮ ЗНАЧЕНИЯ ссылки
// Теперь original и copyOfReference указывают на один объект.
System.out.println(original == copyOfReference); // true (сравнение ссылок)

2. Передача объекта в метод: В Java параметры передаются по значению. Для ссылочных типов передается копия значения ссылки, что приводит к тому, что параметр метода и исходная переменная начинают указывать на один объект.

void modify(List<String> list) { // 'list' — копия ссылки из 'myList'
    list.add("New element"); // Изменяет общий объект
}

List<String> myList = new ArrayList<>();
modify(myList); // После вызова myList содержит "New element"

3. Возврат ссылки из метода:

public Object getSingleton() {
    Object instance = new Object();
    return instance; // Возвращается значение ссылки на объект
}
Object ref1 = getSingleton();
Object ref2 = getSingleton(); // ref1 и ref2 будут РАЗНЫМИ ссылками на РАЗНЫЕ объекты.
// Для синглтона метод всегда возвращал бы одну и ту же ссылку.

Важно: Оператор == сравнивает значения ссылок (адреса), а не содержимое объектов. Для сравнения содержимого используется метод .equals().