gpt4 book ai didi

java - 字符串生成器不使用字符串池中的字符串文字。为什么?

转载 作者:行者123 更新时间:2023-12-01 21:46:00 24 4
gpt4 key购买 nike

String s1 = "Java";
String s2 = "Java";
StringBuilder sb1 = new StringBuilder();

sb1.append("Java");

System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true
System.out.println(sb1.toString() == s1); //false
System.out.println(sb1.toString().equals(s1)); //true

为什么第三条print语句打印的是false?如何让它打印成真?

最佳答案

<强>1。字符串实习

由于字符串的不可变性,JVM 可以进行优化以在 Java 字符串池(JVM 存储字符串的特殊内存区域)中仅存储每个文字字符串的一个副本。这个过程叫做实习

如果找到,Java 编译器将简单地返回对其内存地址的引用,而不分配额外的内存。如果找不到,它将被添加到池中并返回其引用。

String s1 = "Java";
String s2 = "Java";

System.out.println(s1 == s2); //true

<强>2。使用构造函数分配的字符串

使用new操作符创建一个字符串会创建一个新的对象并将其存储在堆空间中

像这样创建的每个字符串都将指向一个具有自己地址的不同内存区域

String s1 = "Java";
String s2 = new String("Java"); //or
StringBuilder sb1 = new StringBuilder();

sb1.append("Java");

System.out.println(sb1.toString() == s1);; //false
System.out.println(s2 == s1);; //false

<强>3。结论

When we create a String object using the new() operator, it always creates a new object in heap memory. On the other hand, if we create an object using String literal, it may return an existing object from the String pool

<强>4。手动实习

手动驻留字符串会将其引用存储在池中,JVM 将在需要时返回此引用

String s1 = "Java";
String s2 = new String("Java").intern(); //or
StringBuilder sb1 = new StringBuilder();

sb1.append("Java");

System.out.println(sb1.toString().intern() == s1);; //true
System.out.println(s2 == s1);; //true

关于java - 字符串生成器不使用字符串池中的字符串文字。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60639807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com