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-rld
和 Hell- 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
)。两个引用不同(s1
和 s2
)但都指向相同的值。
正如 所说,String
是不可变的。因此无需担心更改其中包含的文本。
如果您确实想要更改容器文本,而不是使用 String
class,您可以使用接口 CharSequence
.
的另一个实现
这是我制作的图表,旨在为您提供与 class 相关的各种文本的概览,并帮助您为特定目的选择 class。
我正在编写一个处理字符串的方法(以提取某些内容):
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-rld
和 Hell- 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
)。两个引用不同(s1
和 s2
)但都指向相同的值。
正如 String
是不可变的。因此无需担心更改其中包含的文本。
如果您确实想要更改容器文本,而不是使用 String
class,您可以使用接口 CharSequence
.
这是我制作的图表,旨在为您提供与 class 相关的各种文本的概览,并帮助您为特定目的选择 class。