JavaRush /Курсы /Java Syntax Pro /Сравнение ссылок

Сравнение ссылок

Java Syntax Pro
3 уровень , 5 лекция
Открыта

1. Сравнения

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

Целые числа сравнивать очень легко — просто используйте == и все. Чтобы сравнить вещественные числа, вам уже придется сравнивать их разность (вернее, модуль разности) с каким-нибудь очень маленьким числом.

Сравнение строк еще сложнее. А всё потому, что, во-первых, строки — это объекты, а во-вторых, в зависимости от ситуации программисту часто хочется, чтобы сравнение строк проходило чуть-чуть иначе (учитывая или не учитывая определенные факторы).


2. Расположение строк в памяти

Как вы уже успели увидеть, строки в памяти хранятся не так, как целые и вещественные числа:

Расположение строк в памяти

Для хранения строк используется два блока памяти: один блок хранит сам текст (его размер зависит от размера текста), а второй (размером 4 байта) хранит адрес первого блока.

Хотя опытный программист в такой ситуации скажет что-то вроде «Переменная str типа String хранит ссылку на объект типа String».


3. Присваивание ссылок на строки

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

String text = "Это очень важное сообщение";
String message = text;

А вот что в результате будет в памяти:

Присваивание ссылок на строки

В результате этой операции присваивания объект String так и останется, где был, а в переменную message скопируется только его адрес (ссылка на объект).


4. Работа со ссылками и объектами

А вот если вы решите преобразовать строку к верхнему регистру (заглавные буквы), Java-машина сделает все правильно: у вас будут два объекта типа String, и переменные text и message будут хранить ссылки: каждая на свой объект.

Пример:

String text = "Это очень важное сообщение";
String message = text.toUpperCase(); 

А вот что в результате будет в памяти:

Работа с ссылками и объектами

Обращаю ваше внимание, что метод toUpperCase() не меняет ту строку, у которой он был вызван. Вместо этого он создает новую строку (новый объект) и возвращает ссылку на него.

Или еще более интересный пример. Скажем, вы решили передать строку в объект типа Scanner (чтобы он читал значения из нее).

Пример:

String text = "10 20 40 80";
Scanner console = new Scanner(text);
int a = console.nextInt();
int b = console.nextInt();

Подробнее о работе класса Scanner вы можете узнать по ссылке.

Вот как это все будет храниться в памяти:

Работа с ссылками и объектами. Scanner

При этом объект типа String как был в памяти в единственном экземпляре, так там и хранится — везде передаются и хранятся только ссылки на него.


5. Сравнение ссылок на объекты типа String

Ну и наконец мы дошли до самого интересного — сравнения строк.

Для сравнения строковых переменных можно использовать два оператора: == (равно) и != (не равно). Операторы «больше», «меньше», «больше либо равно» использовать нельзя — компилятор не допустит.

Но есть интересный нюанс: что у нас хранится в строковых переменных? Правильно: адреса (ссылки) на объекты. Вот эти самые адреса сравниваться и будут:

String text = "Привет";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase(); 

Вот что будет в памяти:

Сравнение ссылок на объекты типа String

Переменные message и text хранят адрес (ссылку) одного и того же объекта. А вот переменные s1 и s2 хранят ссылки на очень похожие объекты, но все-таки не на один и тот же объект.

И если вы сравните в коде эти 4 переменные, получите вот такой результат:

Код Вывод на экран
String text = "Привет";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase();
System.out.println(text == message);
System.out.println(text == s1);
System.out.println(s1 == s2); 




true  // адреса равны
false // адреса разные
false // адреса разные


Комментарии (228)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
23 января 2026
Ссылочная переменная с типом String всегда хранит адрес объекта типа String. Объект типа String это массив байтов и кое-что ещё. Строки сами по себе являются неизменяемыми объектами, поэтому когда вызывается метод для строки, сама строка остаётся прежней, а на её основе создаётся новая строка с уже внесёнными изменениями, и адрес этой новой строки передаётся в ссылочную переменную.
Ultralyd Уровень 6
6 января 2026
Каждый вызов toUpperCase() или toLowerCase() создает новый экземпляр объекта, поэтому ссылки s1 и s2 указывают на разные области памяти.
Анна Клушкина Уровень 13
2 января 2026
⛏ ботаем. Хорошая тема
C0N5P1RACY Уровень 41
25 ноября 2025
Хм, получается Айтиния, Айтинии, это как - Айти НИИ - IT НИИ... Информационные Технологии Научно Исследовательский Институт
Роман Зарубин Уровень 8
24 ноября 2025
работаем
23 января 2026
работаем, работаем👌
Phoenix Уровень 1
11 октября 2025
оставлю комментарий здесь, чтоб сказать вам что я стану java разработчиком
Danila Benz Уровень 1
28 декабря 2025
как успехи?
Phoenix Уровень 1
28 декабря 2025
был перерыв. отдохнул и вернулся. хотелось бы иметь энергию для учебы побольше,так бы по 16 часов учился бы. на 26 год планы все те же. главное катить тележку потихоньку,а там и доедим
23 января 2026
Удачи тебе
9 сентября 2025
Спасибо
Anonymous #3584408 Уровень 4
7 августа 2025

String text = "Это очень важное сообщение";
String message = text.toUpperCase();
Минутка наверно ненужных вопросов. Вот мы присвоили новое значение и создали новый объект. Мы как то можем воспользоваться первым значением(String text = "Это очень важное сообщение";) Если я понимаю оно там, так и будет. Или это просто мусор.
motorinatasha Уровень 1
14 августа 2025
думаю можем, ведь оно там осталось существовать - не удалено, как хранилось - так и хранится
Anonymous #3397071 Уровень 4
5 сентября 2025
ну типо ты создаешь такой String text = "Это очень важное сообщение"; String message = text.toUpperCase(); String message1 = text.toLowerCase(); и еще кучу возможных которые мы не прошли, и где-то в проге тебе нужна будет именно String message105 = text.toхзкакойтекстCase(); ну я так ток вижу эту байду
Peter Уровень 6
18 января 2026
Если коротко: Объект существует ровно до тех пор, пока на него есть хоть одна ссылка( пока на него сылается хоть одна переменная). Как только объект теряет все ссылки (как только ни одна переменная не ссылается на этот объект), он автоматически очищается мусорщиком из кучи.
ErenYeag9r Уровень 4
5 августа 2025
Если ты это читаешь, желаю тебе пройти все успешно =)
Anonymous #3516548 Уровень 4
21 июля 2025
baza