Передача строк по ссылке в Java

Java Программирование и разработка

В Java переменные примитивных типов данных, таких как int, char, float и т. д., передаются по значению, что означает, что копия значения переменной передается методу или функции. Однако, когда дело доходит до передачи объектов, в том числе строк, концепция передачи по ссылке по сравнению с передачей по значению может сбивать с толку. В этом сообщении блога мы рассмотрим концепцию передачи строк по ссылке в Java и дадим четкое представление о том, как это работает.

Передача по ссылке против передачи по значению

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

Передача по значению

Когда переменная примитивного типа данных передается в качестве аргумента методу или функции, передается копия значения переменной. Любые изменения, внесенные в параметр в методе или функции, не влияют на исходную переменную вне метода или функции.

Передача по ссылке

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

Понимание строки как объекта в Java

В Java, в отличие от примитивных типов данных, String является не примитивным типом данных, а скорее объектом. Объекты String являются экземплярами класса String, который является частью стандартной библиотеки Java. Это означает, что когда вы создаете переменную String, вы фактически создаете объект, представляющий последовательность символов.

Теперь давайте посмотрим, как работает передача строк по ссылке в Java:

Пример

Рассмотрим следующий пример:

Java

import java.io.*;
 
class GFG {
   
    public static void main(String[] args){
        String str = "Hello";
        System.out.println("Before calling modifyString() method: " + str);
        modifyString(str);
        System.out.println("After calling modifyString() method: " + str);
    }
 
    public static void modifyString(String s) {
        s += " World!";
        System.out.println("Inside modifyString() method: " + s);
    }
}

Выход

Before calling modifyString() method: Hello
Inside modifyString() method: Hello World!
After calling modifyString() method: Hello

Объяснение

В приведенном выше примере у нас есть метод main(), который создает строковую переменную str со значением «Hello». Затем мы передаем эту строковую переменную методуmodifyString(). Внутри методаmodifyString() мы объединяем «Мир!» в исходную строку с помощью оператора += и напечатать измененную строку. Однако, когда мы снова печатаем значение str в методе main() после вызова методаmodifyString(), мы видим, что исходная строка «Hello» остается неизменной.

Это связано с тем, что в Java строки являются неизменяемыми, что означает, что их значения не могут быть изменены после их создания. Когда мы передаем String методу или функции, создается новый объект String с тем же значением, и любые изменения, внесенные в параметр в методе или функции, не влияют на исходный объект String вне метода или функции. Другими словами, хотя мы передали String по ссылке, сама ссылка передается по значению, а исходный объект String остается неизменным.

Обходной путь для передачи строки по «ссылке» в Java

Если вам действительно нужно изменить исходный объект String внутри метода или функции, вы можете использовать обходной путь. Вместо использования оператора +=, который создает новый объект String, вы можете использовать класс StringBuilder или StringBuffer, которые в Java являются изменяемыми классами, для изменения исходного объекта String. Вот пример:

Java

import java.io.*;
 
class GFG {
   
    public static void main (String[] args) {
       StringBuilder sb = new StringBuilder("Hello");
       System.out.println("Before calling modifyString() method: " + sb.toString());
       modifyString(sb);
       System.out.println("After calling modifyString() method: " + sb.toString());
    }
 
   public static void modifyString(StringBuilder sb) {
       sb.append(" World!");
       System.out.println("Inside modifyString() method: " + sb.toString());
   }
}

Выход

Before calling modifyString() method: Hello
Inside modifyString() method: Hello World!
After calling modifyString() method: Hello World!

Объяснение

В этом примере мы заменили параметр String объектом StringBuilder как в методе main(), так и в методе ModifyString(). StringBuilder — это изменяемый класс в Java, поэтому, когда мы изменяем объект StringBuilder внутри методаmodifyString(), вызывая метод append(), он напрямую изменяет исходный объект. В результате изменение отражается в объекте StringBuilder вне метода, а конечный результат показывает измененную строку «Hello World!».

Заключение

В Java объекты String передаются по ссылке, что означает передачу ссылки на расположение объекта в памяти. Однако из-за неизменности строк любые изменения, внесенные в параметр в методе или функции, не влияют на исходный объект String вне метода или функции. Чтобы изменить исходный объект String, вы можете использовать изменяемые классы, такие как StringBuilder или StringBuffer. Важно понимать эту концепцию, чтобы избежать путаницы и обеспечить правильное поведение при передаче строк в Java.

Читайте также:  Глубокое копирование C++
Оцените статью
bestprogrammer.ru
Добавить комментарий