java - 直接添加和引用添加的字符串之间的区别

标签 java string string-pool

<分区>

我遇到了一个询问以下输出的问题:

    String s1 = "String 1";
    String s2 = "String 2";

    String s3 = s1 + s2;
    String s4 = "String 1" + "String 2";

    System.out.println(s3==s4);

输出 - false

现在,由于字符串不是使用 new 运算符创建的,所以对象是在字符串池中创建的,所以根据我的理解 s1 + s2"String 1"+ "字符串 2" 应该相等,s3==s4 应该是 true

但这并不是真实发生的。任何人都可以解释一下吗?

最佳答案

The concatenation发生在运行时,除非两个操作数都是编译时常量表达式。

在 s1 和 s2 之前放置一个 final 修饰符,结果将为真,因为编译器将简单地替换

String s3 = s1 + s2;

通过

String s3 = "String 1String 2";

如果不这样做,将在运行时通过将两个字符串附加到 StringBuilder 并获取结果来创建一个新字符串。

请注意,尽管从知识的角度来看这很有趣,但在实践中,您不应该关心性能优化,而是始终将字符串与 equals() 进行比较。

关于java - 直接添加和引用添加的字符串之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44352360/

相关文章:

java - 从列表中选择一个数据库

java - 将 JLayeredPane 添加到 JPanel

java - Hbase方案设计-最佳实践

java - 可以在运行时将字符串添加到字符串池中吗?

java - 当前平台不支持 ICON_IMAGE 功能

c - 在字符串文字上使用 strdup 的优点和缺点

c# - 为什么 String.Trim 不修剪分号?

c++ - 反转字符串,奇怪的输出 C++

java - 在普通内存和字符串池中创建新字符串

java - StringBuilder.append() 方法是否填满了字符串池?