Passing Strings By Reference in Java

2025 年 5 月 10 日 | 阅读 3 分钟

在 Java 中,像 int、char 和 float 这样的原始数据类型变量是通过值传递的。这意味着变量的值的副本被传递给方法或函数。然而,在传递字符串等对象时,按引用传递和按值传递之间的区别有时可能会令人困惑。

理解 Java 中的字符串作为对象

Java 中的字符串是表示字符序列的对象。它们是使用 String 类创建的,并且它们的不变性是一个重要的特征。在处理字符串时,任何看似会更改字符串的操作实际上都会生成一个新的 String 对象。

理解按引用传递 vs 按值传递

当一个 原始数据类型变量作为参数传递给一个方法时,会传递该变量值的副本。在 方法内部对参数所做的修改不会影响方法外部的原始变量。

输出

 
After method call: Hello, World!   

按引用传递

当一个 对象被作为参数传递给一个方法时,传递的是指向该对象内存地址的引用,而不是对象本身的副本。这意味着在方法内部对对象的修改可以在原始对象中显示。然而,在 Java 中,对象也是按值传递的;但是,传递的是引用的值(内存地址)。

输出

 
After method call: 20   

Java 中能否通过引用传递字符串?

Java 中的字符串是不可变的,这意味着一旦创建,就无法更改其内容。当一个字符串被传递给一个方法时,会传递该字符串引用的副本。然而,由于字符串是不可变的,任何看似会更改字符串的操作实际上都会生成一个新的 String 对象,使原始字符串保持不变。让我们通过一个例子来研究这一点。

输出

 
Inside method: World
After method call: Hello   

通过“引用”传递字符串的变通方法

虽然字符串是不可变的,不能直接通过引用传递,但你可以使用一个包装器对象来实现类似的行为。通过将字符串封装在一个可变对象中,你可以间接地修改字符串。例如:

输出

 
After method call: Hello World   

间接修改字符串

虽然由于不可变性无法直接修改字符串,但你可以使用可变对象,如 StringBuilderStringBuffer 来实现类似的功能。下面是一个例子:

输出

 
Inside method: Hello World
After method call: Hello World   

下一主题Groovy vs Java