Java:"new String(oldString)"有必要吗? (字符串是引用还是值?)

Java: Is "new String(oldString)" necessary? (Is String a reference or a value?)

我正在编写一个处理字符串的方法(以提取某些内容):
public static String myProcessor (String myInput) {...

我想在这个方法中有一些字符串对象,我可以在 (workString = workString.replace(...)

上应用我的转换

但是,我不想更改原始字符串(通过对我的方法的引用,即:
myProcessor(originalString)) - 因为在我的方法被调用之后可能会有方法调用,它也想 process/extract 来自原始字符串的东西 在我的方法调用之前

我仍在学习 Java 而且,根据我的书(Deitel & Deitel - “Java 如何编程”):
~”原始类型是按值传递的。其他变量类型是针对对象的,而那些是按引用传递的,因此对象的变量赋值是将引用传递给同一对象。一个变量引用的对象发生变化可以在读取其他变量时看到(if Object var2 = var1)"
(这不是逐字的,只是我从中理解的!)

所以,我想我会尝试:String workString = new String(myInput);,这应该使用来自 myInput 的数据创建一个新的 String 对象,但我可以随心所欲地操作 workString,不用担心,我正在对其他地方使用的对象进行更改。

IntelliJ 建议这是多余的,我可以这样做:String workString = myInput,这让我感到困惑...

IntelliJ 就在这里吗?
实际上,我什至需要创建局部作用域 workString,或者一旦变量“到达”方法,引用就会“分离”? (即:在 myProcessor 中,myInput 不再持有对 myProcessor 调用中 originalString 的引用,但它创建了一个新的字符串对象?

如果您的回答是关于 String 对象还是所有对象,您能否也简要说明一下?
我有一种感觉,也许 String 介于 Primitive 类型和 Object 类型之间,并且对其应用了特殊规则...

正如@AndyTurner 所提到的, 在 Java 中,String 是不可变的,这意味着对 String 的任何操作都不会改变 original String.

例如:

myString = "Hello World"; // literal
myString = myString.replace("o", "-"); // not literal
myString = myString + " !"; // not literal

Hello World放在String Pool中赋值给变量myString.
Hell- W-rld 放入String Pool 并赋值给变量myString.
Hell- W-rld !放入String Pool,赋值给变量myString.

但是! 由于 Hell- W-rldHell- W-rld ! 不是文字 (GC of String literals) 并且无法访问,因此它们是垃圾 Collection.
的候选对象 最后只有两个 String 会在池中:Hello World !(两个文字)。

编辑:“o”和“-”将保留在池中,因为它们也是文字

Could you also please mention briefly if your answer is regarding just String objects or all objects

这取决于 属性, String is not a Primitive but is treated in some regards like one. Primitives are immutable String 也是如此。

回答你的标题:

Is “new String(oldString)” necessary? (Is String a reference or a value?)

它允许将值存储在字符串池中,但是:

String s1 = "Hi";
String s2 = new String(s1); // Any other operation would assign a new reference as String is immutable
s1 == s2; // false
s1.equals(s2); // true

A String 通过引用传递并且 new 分配一个新的引用(到池中相同的 String)。两个引用不同(s1s2)但都指向相同的值。

正如 所说,String 是不可变的。因此无需担心更改其中包含的文本。

如果您确实想要更改容器文本,而不是使用 String class,您可以使用接口 CharSequence.

的另一个实现

这是我制作的图表,旨在为您提供与 class 相关的各种文本的概览,并帮助您为特定目的选择 class。