Почему "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); //работает
}
Потому что String
- неизменяемый (immutable) согласно спецификации класс. В случаях подобных s.concat(s)
результат операции помещается в кучу (heap), но это уже новый объект типа String
, а объект в памяти, на который указывает ссылка s
остаётся прежним.
Почему String неизменяемый? и как это помогает программисту?
Также искал хорошую картинку, которая демонстрирует именно этот случай, но всё время попадаются объяснения про пул строк, что интересно, но к делу не относится, и вот нашёл http://keysandstrokes.info/java-immutable-strings/
И вот про пул строк на всякий случай https://www.codenuclear.com/string-facts/
Не работает по-вашему это значит что не выводится результат конкатенации в консоль?
Метод concat
не модифицирует строку на которой он вызван, он возвращает результат своей работы в виде новой строки (так же как Вы и писали про конкатенацию через оператор +
).
Во всех случаях, когда Вы написали "работает", Вы используете оператор присваивания, в результате чего значение переменной s
и меняется.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Каким образом можно программно создать новый java класс? И можно ли вообще?
Почему в строке с комментарием не дает ошибку компиляции? Пробовал с другими ссылочными типами - там все нормально, ошибка компиляции, а в случае...
При создании фрейма, я создаю JScrollPane, получаю его JScrollBar и переопределяю для него свой UI ScrollgetVerticalScrollBar()
Работаю в Android Studio и написал небольшое приложение, после чего запаковал в apkПосле решил apk открыть и попробовать изменить, но при декомпиляции...