【问题标题】:Reference is not created while using + operator to concat two strings使用 + 运算符连接两个字符串时未创建引用
【发布时间】:2022-01-23 10:04:26
【问题描述】:

我正在尝试连接两个字符串,一个带有一些值的字符串,另一个带有空值。

例子:

String string1="Great"
String string2="";

并用 concat 函数和 + 运算符连接这两个字符串

例子:

 String cat=string1.concat(string2)
 String operator=string1+string2

根据我的理解,在 concat 函数中使用空字符串,因为 string2 为空,不会创建新的引用。但是在使用 + 运算符时,将在字符串池常量中创建一个新的引用。但是在下面的代码中,使用 + 运算符时不会创建新的引用。

public class Main {
    
    public static void main(String[] args) {
        String string1="Great",string2="";

        String cat=string1.concat(string2);
        if(string1==cat)
        {
            System.out.println("Same");
        }
        else
        {
            System.out.println("Not same");
        }
        String operator=string1+string2;
        if(operator==string1)
            System.out.println("Same");
        else
            System.out.println("Not same");
    }
}

输出:

字符串 1:69066349

猫:69066349

一样

字符串1:69066349

接线员:69066349

不一样


从上面的代码中,由于它使用了 + 操作符,变量 : 操作符的引用应该引用新的内存,但它指向的是 string1 引用。请解释一下上面的代码。

【问题讨论】:

  • String.hashCode() 是字符串值的函数,而不是其地址
  • 是的,但是我通过调试代码检查了地址引用。 hashCode 供我参考。
  • hashCode与这里的引用无关,只是字符串值的函数
  • 这能回答你的问题吗? String concatenation: concat() vs "+" operator
  • 没有它指向同一个引用,我通过调试检查了地址。我在问题中提到了它。仔细阅读问题。

标签: java string string-concatenation


【解决方案1】:

这一切都在文档中。

对于String.concatjavadoc 声明如下:

如果参数字符串的长度为0,则返回这个String对象。

对于+ 运算符,JLS 15.8.1 声明:

字符串连接的结果是对String 对象的引用,该对象是两个操作数字符串的连接。在新创建的字符串中,左侧操作数的字符在右侧操作数的字符之前。

String 对象是新创建的 (§12.5),除非该表达式是常量表达式 (§15.29)。

如您所见,对于第二个字符串的长度为零且这不是常量表达式的情况,结果会有所不同。

这就是您的示例中发生的情况。


你也说过:

但在使用+ 运算符时,将在字符串池常量中创建一个新引用。

这与您的问题没有直接关系,但是......实际上,不会在那里创建它。它将在堆中创建对常规(非实习)String 对象的引用。 (它只会在类文件的常量池中......因此字符串池......如果它是一个常量表达式;参见JLS 15.29

注意字符串池和类文件常量池是不同的东西。


我可以补充几点吗:

  • 您可能不应该使用String.concat+ 运算符更简洁,JIT 编译器应该知道如何优化不必要的中间字符串的创建......在少数情况下,出于性能原因您可能会考虑使用 concat

  • 利用没有创建新对象的事实是一个坏主意,以便您可以使用== 而不是equals(Object)。你的代码会很脆弱。只需始终使用equals 来比较String 和原始包装器类型。它更简单,更安全。

简而言之,你甚至问这个问题的事实表明你走上了一条死胡同。了解concat+ 之间的这种极端情况差异是……毫无意义……除非您打算参加一个面向 Java 极客的问答节目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 2012-05-07
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多