Интересный случай с конкатенацией

83
18 июня 2021, 23:30

Почему "s.concat(s)" в отдельности не работает а вот при присваивании к новой String или сразу в sout - работает? Я знаю что String это Immutable класс, и по идее изменять s не получится, и где то я прочел и понял, что во время конкатенации через знак + создается новая строка в памяти, но вроде же в обеих случаев и в случае "s.concat(s);" и в случае "s = s.concat(s);" написан один и тот же код, я про "s.concat(s);"

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

public static void main(String[] args) {
    String s = "a".concat("b"); //работает
    s.concat(s); //не работает
    s = s.concat(s);//работает
    s.concat("."); //не работает
    //String b = s.concat(s); //работает
    System.out.println(s); //работает
}
Answer 1

Потому что String - неизменяемый (immutable) согласно спецификации класс. В случаях подобных s.concat(s) результат операции помещается в кучу (heap), но это уже новый объект типа String, а объект в памяти, на который указывает ссылка s остаётся прежним.

Почему String неизменяемый? и как это помогает программисту?

Также искал хорошую картинку, которая демонстрирует именно этот случай, но всё время попадаются объяснения про пул строк, что интересно, но к делу не относится, и вот нашёл http://keysandstrokes.info/java-immutable-strings/

И вот про пул строк на всякий случай https://www.codenuclear.com/string-facts/

Answer 2

Не работает по-вашему это значит что не выводится результат конкатенации в консоль?

Метод concat не модифицирует строку на которой он вызван, он возвращает результат своей работы в виде новой строки (так же как Вы и писали про конкатенацию через оператор +).

Во всех случаях, когда Вы написали "работает", Вы используете оператор присваивания, в результате чего значение переменной s и меняется.

READ ALSO
Программное создание класса

Программное создание класса

Каким образом можно программно создать новый java класс? И можно ли вообще?

89
Почему я могу присвоить массив объекту?

Почему я могу присвоить массив объекту?

Почему в строке с комментарием не дает ошибку компиляции? Пробовал с другими ссылочными типами - там все нормально, ошибка компиляции, а в случае...

96
Свой UI для JScrollPane

Свой UI для JScrollPane

При создании фрейма, я создаю JScrollPane, получаю его JScrollBar и переопределяю для него свой UI ScrollgetVerticalScrollBar()

97
Распаковка apk и работа с исходным кодом

Распаковка apk и работа с исходным кодом

Работаю в Android Studio и написал небольшое приложение, после чего запаковал в apkПосле решил apk открыть и попробовать изменить, но при декомпиляции...

85