public class Test1 {
public static void main(String[] args) {
String s1 = "hello";
int mas[] = new int[3];
test(mas);
test2(s1);
System.out.println(mas[0]);
System.out.println(s1);
}
static void test(int massive[]) {
massive[0] = 1;
}
static void test2(String string) {
string.concat("111");
}
}
В обоих случаях для ссылочных типов передается копия ссылки на объект. Но только в случае с массивом мы меняем этот объект. А в случае со строкой на место переменной нового объекта не создается(я помню что саму строку изменить нельзя).
Почему? Чего я не понимаю?
Метод String.concat() конкатенирует текущую строку с аргументом и возвращает полученную строку. Исходная строка не модифицируется.
Схематично выглядит это так
class String {
public String concat(String arg) {
return this + arg;
}
}
Сама ссылка на строку передается по значению, то есть создается копия ссылки аргумента. Функция работает с копией ссылки.
string.concat("111");
Однако исходная ссылка не меняется. Более того этот метод не меняет исходную строку. Он создает новую строку. Так что в любом случае исходная строка не меняется даже если вы в функции напишите
string = string.concat("111");
Вы можете представить определение метода и его вызов следующим образом
test2(s1);
// ...
static void test2( /* String string */) {
String string = s1;
string = string.concat("111");
}
В случае с массивом, то меняется память, занимаемая объектом, на который ссылается ссылка при использовании оператора индексации.
String.concat ничего не меняет, он возвращает новую строку
В других ответах эта тема раскрыта, я же хотел добавить следующее.
Строки в Java немутабельны. Это, помимо прочего, гарантирует вам, что объявленная, как String a = "string"; строка не может быть изменена никем, кому бы вы её не передавали.
Другие классы/методы могут создавать новые строки на основе этой, но не в состоянии изменить вашу.
Пока вы самостоятельно не замените значение a новым значением(a = getNewStr();) вы можете быть уверены в его неизменности.
Даже заменяя значение таким образом, вы не меняете исходную строку, а лишь меняете ссылку на вновь созданную. Если где-то сохранились указатели на старое значение(String b = a;), они в безопасности.
Этим свойством(immutable) обладают все классы-обёртки примитивов(Integer, Long и тп).
Сборка персонального компьютера от Artline: умный выбор для современных пользователей