当前位置: 首页 > 知识库问答 >
问题:

使用运算符连接两个字符串时未创建引用

濮阳翔
2023-03-14

我试图连接两个字符串,一个字符串有一些值,另一个字符串有空。

示例:

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引用。请解释上述代码。

共有1个答案

邓俊英
2023-03-14

这些都在文档中。

对于<代码>字符串。javadoc声明:

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

对于操作员,JLS 15.8.1规定:

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

字符串是新创建的(§12.5),除非表达式是常量表达式(§15.29)。

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

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

你还说:

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

这与你的问题没有直接关系,但。。。事实上,不会在那里创建。它将创建对堆中常规(非内部)字符串对象的引用。(如果它是一个常量表达式,它将仅位于类文件的常量池中,因此也将位于字符串池中;请参阅JLS 15.29)

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

我可以补充几点吗:

>

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

    利用没有创建新对象的事实,以便可以使用而不是使用等于(对象),这是一个坏主意。您的代码将很脆弱。只需始终使用equals来比较字符串和基本包装类型。它更简单、更安全。

    简而言之,你甚至问这个问题的事实表明你正在走一条死胡同。了解conat之间的这种边缘情况差异是...毫无意义...除非您打算参加Java极客的智力竞赛节目。

  •  类似资料:
    • 我知道这可能是非常基本的,也可能是非常直接的,但我无法清楚地理解在这种情况下会发生什么,所以,就这样吧。 在以下代码中: 我知道str1和str2将在字符串常量池中分别创建一个对象“Hello”和“World”。而对于str3,将在字符串常量池外部创建一个新对象,该对象指向在字符串常量池内部创建的“HelloWorld”。 我的问题是,如果我concat 2个或更多字符串(使用“”或concat(

    • 返回前用调试器运行程序时,指针的值为0x0000000009DFAA90,但的值变为0x0000000009DFAA98。 这种情况只发生在字符串类型中。我试着对我的一个类的“int[10]”、“string*[10]”和对象做同样的操作,但问题只发生在处理string和代码时: 工作非常好。 有没有人能解释一下为什么会发生这种情况,以及如何使它正常工作? PS:我们正在使用Visual Stud

    • 问题内容: 我在玩python,我意识到我们不需要使用’+’运算符来连接字符串,除非它与值一起使用。 例如: 现在我有两个问题: 为什么语句3无效,而语句1无效? 陈述1和2之间是否存在技术上的差异,例如计算速度等? 问题答案: 从文档: 允许使用可能使用不同的引用约定的多个相邻字符串文字(由空格分隔),其含义与它们的串联相同。因此,“ hello”“世界”等同于“ helloworld”。 语句

    • 您创建的MovieDBContext类负责处理连接到数据库,并将Movie对象映射到数据库记录的任务中。你可能会问一个问题,如何指定它将连接到数据库? 实际上,确实没有指定要使用的数据库,Entity Framework将预设值使用的LocalDB。 在本节中,我们将显式地在Web.config文件中,添加应用程序的连接字符串(connection string)。 SQL Server Expr

    • 问题内容: Python中常见的反模式是在循环中使用串联字符串序列。这很不好,因为Python解释器必须为每次迭代创建一个新的字符串对象,并且最终要花费二次时间。(在某些情况下,最新版本的CPython显然可以优化此功能,而其他实现则不能,因此建议程序员不要依赖此功能。)是执行此操作的正确方法。 但是,我听说它说过),您 _永远都不_要将它用于字符串连接,而应该始终使用或格式字符串。我不明白为什么

    • 问题内容: 想知道有没有比如下计算给定字符串的字符数更简单的方法? 问题答案: 具有完全的Unicode支持(Java 11+)1的最简单的方法来计算字符串中每个字符的出现次数: 1)答案的结尾是具有完整Unicode支持的Java 8版本。 输出量 更新: 对于Java 8+(不支持补充平面中的字符,例如emoji): 更新2: 同样适用于Java 8+。 我误会了,以为它是在Java 9之前才