Вопрос неизменности строк - PullRequest
1 голос
/ 19 июля 2011

Я знаю, что строки Java неизменны.Тем не менее, когда я запускаю функцию, представленную ниже, вывод не соответствует ожидаемому.

    public static void main(String[] args) {
        String s = "wicked";
        String [] ss = new String [1];
        ss[0] = "witch";
        modify(s, ss);
        System.out.println(s+" "+ ss[0]);
    }
    private static void modify(String s, String[] ss) {
        s = "sad";
        ss[0] = "sod";          
    }

Вывод, который я получаю, равен wicked sod, а не wicked witch, как я ожидал.Это потому, что я передаю ссылку на массив в качестве второго аргумента функции модификации, а не на передачу самого объекта String?Любое разъяснение высоко ценится.

Ответы [ 4 ]

10 голосов
/ 19 июля 2011

Вы изменили содержимое массива - массивы всегда изменяемы.

Массив изначально содержит ссылку на строку "witch".Ваш метод modify изменяет массив, чтобы он содержал ссылку на строку "sod".Ни одна из самих строк не была изменена - только содержимое массива.

(Обратите внимание, что значение ss[0] не является строкой - это ссылка на строку.)

1 голос
/ 19 июля 2011

Это потому, что я передаю ссылку на массив в качестве второго аргумента в функцию модификации, в отличие от передачи самого объекта String?

Точно. Вы передаете ссылку на изменяемый объект (массив). Когда метод изменяет этот объект, изменения будут видны за пределами метода.

0 голосов
/ 19 июля 2011

Строки, являющиеся неизменяемыми, означают, что вы не можете изменить «привет мир» на «привет».Но вы можете назначить целую новую строку.И это то, что вы делаете здесь.

Вы даете ссылку на объект массива.Вот почему содержимое массива изменено.

0 голосов
/ 19 июля 2011

Прочитайте ОЧЕНЬ хорошую статью о передаче параметров метода по Yoda Передача параметров в Java - по ссылке или по значению?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...