return (string expr) 和 return New String(string expr) 有啥区别?

Posted

技术标签:

【中文标题】return (string expr) 和 return New String(string expr) 有啥区别?【英文标题】:What's the difference between return (string expr) and return New String(string expr)?return (string expr) 和 return New String(string expr) 有什么区别? 【发布时间】:2013-12-25 10:48:36 【问题描述】:

这两种方法有区别吗?

public String toString() 
    return this.from.toString() + this.to.toString();


public String toString() 
    return new String(this.from.toString() + this.to.toString());

(当然,假设 from.toString()to.toString() 方法返回字符串)。

基本上我对 Java 中的字符串处理感到困惑,因为有时字符串被视为原始类型,即使它们是类实例。

【问题讨论】:

我认为两者都返回字符串对象 bcz "String" 是 Java 中的一个对象,第二个你没有必要使用包装对象 "new String()" 就是这样......两者都返回不可变的 "String" 对象 Difference between string object and string literal的可能重复 Jack,以后请在提问前先进行 Google 和 Stack Overflow 搜索。通常,您会发现问题已经得到了非常详细的回答。您的问题已在 SO 上多次回答。 另见What is the purpose of the expression “new String(…)” in Java?。 @mars 当然,我并没有打算问一个重复的问题,我只是想不出我需要搜索什么......我寻找“隐式对象创建”并找到没有。既然您已经说过“文字字符串”,我看到了我的错误:) 虽然我的问题不完全是文字字符串,而是字符串表达式......但这可能已经在某个地方被问过并得到了回答。 【参考方案1】:

There is no difference in real.

因为你的两个函数都有返回类型String,所以创建一个新的String() 只是一个开销。它就像将一个字符串再次包装成一个字符串并在池中创建一个新字符串,这实际上没有任何优势。

但是原始类型和 String 对象的一个​​主要区别是 String 类总是创建新的字符串。

String str = "my string";

如果字符串池中已经存在“我的字符串”。那么它将使用相同的字符串而不是创建新的。

这就是为什么当,

String str1= "my string";
String str2 ="my string";

str1==str2? --> will return true

上面的结果为真,因为使用了池中相同的String对象。

但是当你这样做时,

String str = new String("new string");

总是会创建一个新的 String 对象,而不管池中是否已经存在相同的对象。

所以比较:

String str1 = new String("new string");
String str2 = new String("new string");

str1==str2 --> will return false

【讨论】:

new String(String) 不会包装原始字符串。它创建原始字符串的全新(无用)副本 假设(但不知道)Java 内部也会为第一种方法创建某种对象,不是吗?所以在这两种情况下基本上都发生了相同的情况,只是在第一种情况下它是隐式发生的,而在第二种情况下是显式发生的?编辑:不,当然,JVM 第二次也需要创建隐式对象,然后总共创建两个对象......好的,明白了。 没有。 this.from.toString() + this.to.toString() 已经是一个 String 对象,包含一个(比如说)2000 个字符的数组。 new String(this.from.toString() + this.to.toString()) 创建另一个 String 对象,其中包含另一个 2000 个字符的数组,它是 String this.from.toString() + this.to.toString() 中包含的 2000 个字符的数组的副本。制作这个额外的副本是没有意义的:它使用更多的内存,它迫使 GC 工作更多,制作副本需要 CPU 时间,并且返回的 String 无论如何都具有相同的值。【参考方案2】:

如果在某个时候您之前定义了String“ABC”,则存在差异。 Java实习生字符串,所以当你没有明确声明你想要一个new对象时,它将返回一个具有相同值的对象。举个例子。

String abc = "abc";

// Some code.

return new String("abc"); // This will be a new object.

如果你这样做:

String abc = "abc";

// Some code.

return "abc"; // This will be the above object.

这是因为JVM用相同值的对象浪费内存是没有意义的,所以它把它们存储在内存中,等待你再次需要/使用它们!

你选择哪一个?

String 实习过程通常不会对你造成太大的阻碍,所以你通常可以选择前者。

【讨论】:

不,不是。使用 new String(String) 是没有用的,因为 String 是不可变的。字符串的状态永远不会改变。此外,实习与OP的问题无关。 我读了开头,这是正确的,但我没有看到关于字符串状态的额外爵士乐,当我第二次阅读时是“什么?他在说什么?”编辑后的答案是正确的。虽然 OP 没有直接询问实习,但他询问了差异,实习是主要部分。 大部分同意,但这让我想知道:“字符串实习过程通常不会对您造成太大影响”。你能举一个实际的例子,说明 String interning 确实“对你的影响太大”吗? 我对这个问题采取了“永不言败”的方法。【参考方案3】:

第二个有额外的开销。在第二种方法中,您将字符串初始化一次比第一个...类似

String s = "something";

return s; 

return new(s);

除此之外,两者都将执行完全相同的任务。

【讨论】:

【参考方案4】:

return new String(this.from.toString() + this.to.toString());

以上语句将创建 2 个对象。

第一个对象是指this.from.toString() + this.to.toString() 的串联值。这个没有参考。 由于new 运算符而创建了第二个对象。

return this.from.toString() + this.to.toString();

这将在堆内存区域创建 1 个对象。

【讨论】:

对该对象的引用存储在字符串池区:不,它不会。

以上是关于return (string expr) 和 return New String(string expr) 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

oracle 函数 NVL2...NVL

shell expr match

正则匹配URL地址

jQuery选择器探究:正则表达式汇总

jQuery选择器探究:正则表达式汇总

java基础面试