java - `+=` 运算符是否总是创建一个新的字符串对象?

标签 java string memory

如果池内存已经有一个具有相似内容的对象,那么如果我们尝试使用不同的引用变量创建相同的对象,那么只会创建一个新的引用变量,不会创建新的对象。例如;

String s7="1";
String s8 ="1";
System.out.print(s7==s8);  //True

这里只创建了一个对象。 但在下面的例子中

public class JavaApplication1 {
    public static void main(String[] args) {
        String s1 = "1", s2 = "2", s4 = s1 + s2, s5 = "12";
        final String s3 = s1 + s2;
        s1 += s2;
        System.out.print((s1 == s3) + "" + (s1 == s5) + "" + "" (s3 == s5));
    }
}

输出为假假假 即使 s3 被声明为最终表达式!为什么?

最佳答案

这是因为

1) 由常量表达式 (§15.28) 计算的字符串在编译时计算,然后将其视为文字。

2) 在运行时通过连接计算的字符串是新创建的,因此是不同的。

这是一个例子:

    String s7 = "77";
    String s8 = "77";

    String s10 = "7";
    String s11 = "7";

    String s9 = s10+s11;
    String s12 = "7"+"7";

    //printing the address
    System.out.println(System.identityHashCode(s7));
    System.out.println(System.identityHashCode(s8));
    System.out.println(System.identityHashCode(s9));
    System.out.println(System.identityHashCode(s12));

    System.out.println(s7==s9);
    System.out.println(s7==s12);

输出:

705927765
705927765
366712642  ---> address is different
705927765
false
true

虽然我刚才也经历过这个事情。但这是我的假设:

String s9 = s10+s11;之外的所有文字都是在编译时计算的。这就是为什么我们得到不同的地址。

关注String literals javadoc了解更多详情。

关于java - `+=` 运算符是否总是创建一个新的字符串对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47291931/

相关文章:

java - 有两个键的 map

java - 卡夫卡听众,不使用字符串?

java.rmi.ServerException : RemoteException occurred in server thread (ClassNotFoundException)

string - Bash 在将字符串转换为参数时不解析引号

php - Wordpress - 尝试编辑帖子 - "Fatal error: Out of memory"...但内存限制很高

有人可以解释一下为什么我的程序崩溃吗?

php - PHP memory_limit 越多越好吗?

java - 访问 AST 类时出错

java - 使用相同的变量打印收据,因此每个项目都会传递相同的值。

javascript - 如何在ejs中使用带有字符串的if语句?