2017-01-13 3 views
0

Я думал, что метод не может напрямую изменить объект в java, но, как я вижу, я ошибся.Изменение связанного списка с помощью метода

  public static void main(String[] args) { 

      LinkedList<Integer> list = new LinkedList<>(); 
      String name = "Boycie"; 

       add(5, list); 
       add(2, list); 
       add(3, list); 

       for(Integer integer:list){ 
        System.out.print(integer + " "); 
       } 

       toUpperCase(name); 
       System.out.println(name); 
      } 

      public static void add(int number, LinkedList<Integer> list){ 
       list.add(number); 
      } 
      public static void toUpperCase(String name){ 
       name.toUpperCase(); 
      } 

Может кто-нибудь объяснить мне, почему метод работает для Linked List, но не для строкового объекта? Я думал, что это тоже не сработает для списка, и что мне нужно будет иметь метод возвращаемого типа LinkedList, как и для String.

+0

Строки неизменяемы, LinkedList не является. –

ответ

3

Строки в Java неизменяемые поэтому все операции над строкой возвращают новую копию.

Так что вы можете сделать, как показано ниже, чтобы получить результаты, которые вы ожидаете:

LinkedList<Integer> list = new LinkedList<>(); 
    String name = "Boycie"; 

    add(5, list); 
    add(2, list); 
    add(3, list); 
    for (Integer integer : list) { 
     System.out.print(integer + " "); 
    } 
    String newName = toUpperCase(name); 
    System.out.println(name); 
    System.out.println(newName); 
} 

public static void add(int number, LinkedList<Integer> list) { 
    list.add(number); 
} 

public static String toUpperCase(String name) { 
    return name.toUpperCase(); 
} 
+0

Да, я знаю, что это будет работать так же, как и для строки (я тоже написал), но на самом деле это не отвечало на мой вопрос. Но я получил свой ответ: «Изменения списка», потому что метод принимает ссылку, а не объект, поэтому имеет ту же ссылку, что и объект, содержащий объект (переменная списка в моем случае), если я понял. –

+2

'Java передается по значению, но переданное значение является ссылкой на объект в памяти'. Кроме того, 'Строки неизменяемы' – Null

+1

Я просто понял, что спасибо за ответ. Я просто подумал, что он помещает объект в стек, а не его ссылку. –

-2

В Java, если и передать переменную в качестве аргумента, она всегда проходит местоположение referrence/памяти, таким образом, если и изменить значение внутри метода также будет изменено исходное значение. Вот почему связанный список меняется. Теперь для строки name.toUpperCase() вернет новую строку, содержащую версию в верхнем регистре исходной строки, то есть она не изменит исходную строку. Чтобы изменить строчную строку, используйте следующее:

name = name.toUpperCase();

Смежные вопросы