Page 198 - 6253
P. 198
2301506
2301506
Незважаючи на те, що однакові за значенням рядкові об'єкти розташовані в
різних ділянках пам'яті, значення їх хеш-кодів співпадають. Оскільки у Java всі
посилання зберігаються в стеку, а об'єкти – в купі, то при створенні об'єкту s2
спочатку створюється посилання, а потім це посилання зв’язується з відповідним
об’єктом. Тому s2 асоціюється із вже існуючим літералом, оскільки об'єкт s1 уже
зв’язаний із посилання на цей літерал. При створенні об’єкту s3 відбувається виклик
конструктора, тобто виділення пам'яті відбувається раніше за його ініціалізацію, і
тому в купу поміщається новий об'єкт.
У мові Java можна об’єднувати рядки із даними інших типів. Для цього
використовується оператор об’єднання або конкатенації «+». Під час операції
об’єднання усі типи даних приводяться автоматично до рядків. Компілятор
перетворює операнди в їх рядкові еквіваленти, в той час як інші операнди оператора
«+» є екземплярами класу String.
Проте, під час такого об’єднання необхідно враховувати один досить важливий
момент. Розглянемо фрагмент програми в якому відбувається об’єднання декількох
рядків:
String str = "Десять: " + 4 + 6;
System.out.println(str);
Запустивши програму на виконання отримаємо наступний результат:
Десять: 46
Такий результат є досить логічним, оскільки пріоритети операторів
забезпечують спочатку об’єднання рядка "Десять: " з рядковим еквівалентом числа
4, а потім результат об’єднується з рядковим еквівалентом числа 6.
Для того, щоб отримати правильний результат необхідно змінити пріоритет
виконання операцій, шляхом вкладення виразу «4 + 6» в круглі дужки.
String str = "Десять: " + (4 + 6);
System.out.println(str);
Запустивши програму на виконання отримаємо наступний результат:
197