Строки в Java представляют собой последовательность символов, но считаются ли они типом данных «Reference» или «P rimitive»? Являются ли они неизменяемыми? Что, если я изменил значение строки?

Строки являются ссылочными / сложными объектами

Строки в Java подпадают под категорию справочных / сложных типов данных объекта. Они хранят ссылку на объект, а не на сам объект.

Когда вы назначаете строковую переменную другой переменной, она фактически копирует ссылку на объект, но не сам объект. Это означает, что поскольку строковая переменная содержит ссылку на фактические данные, она передает эту ссылку, а не фактические данные. Итак, это передача по значению!

Строки неизменны

Неизменяемость означает, что объект, на который ссылается строка, не может быть изменен, вот и все. Длина строковой переменной устанавливается сразу после ее инициализации.

String str = "abc"; 
// same as: 
    // char data[] = {'a', 'b', 'c'}; 
    // String str = new String(data); 
System.out.println(str); // abc

Это подводит нас к последнему вопросу…

Что, если я изменил строку после ее инициализации ?!

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

String str1 = "Java is fun!";
String str2 = str1;
str2 = "Strings are immutable"; // str2 is no longer points to "Java is fun!"
System.out.println(str1); // Java is fun!
System.out.println(str2); // Strings are immutable

Вот более подробная демонстрация того, что именно происходит при распределении памяти.

Если вы переходите с языка C #, строки относятся к ссылочным типам, и они также являются неизменяемыми.

Вам может потребоваться использовать класс StringBuilder в Java и C # вместо String, если вам нужна изменяемая строковая переменная.