如String s1=“s”+“h”;String s2=“sh”;
a 在字符串常量池中先查看是否有已经开辟了s字符串和h字符串的空间
b 若没有则需要先在字符串常量池里面开辟字符串字面量s和字符串字面量h的空间
c 因为使用了+进行拼接,所以也会先去字符串常量池中查找里面是否已经存在sh这个字面量了,
d 我们这个时候发现里面并没有存在sh这个字符串,因此会去开辟一个属于sh字符串的空间,并把这个空间的地址赋值给了s1
我们会先去字符串常量池中查找是否已经存在sh这个字符串,发现已经存在了这个字符串,那么我们这个时候只需要将"sh"这个字符串在字符串常量池中的内存地址赋值给s2就行
因为s1、s2指向的内存地址都相同,都指向的是在字符串常量池中的"sh"这个字符串开辟的空间
package Work;
public class Test05 {
public static void main(String[] args) {
String s1="s"+"r";
String s2="sr";
System.out.println(s1==s2);
}
}
package Work;
import java.io.PrintStream;
public class Test05
{
public Test05()
{
}
public static void main(String args[])
{
String s1 = "sr";
String s2 = "sr";
System.out.println(s1 == s2);
}
}
a 如果是字符串变量进行拼接,这个时候就会new StringBuilder对象去进行拼接,
b 因为它并不知道你那个变量里面存放了多长的字符串,用字符串常量池去存储变量的会没有必要,因此为了节约空间,因此只要涉及到字符串变量与字符串字面量(能清楚的知道里面的值,如"12")的拼接操作本质上还是new了一个StringBuilder去进行拼接操作(append),
c 然后调用toString方法(本质还是new了一个String对象进行返回的)去返回String对象
package Work;
public class Test05 {
public static void main(String[] args) {
String s1="s";
String s2=s1+"r";
String s3="sr";
System.out.println(s2==s3);
}
}
package Work;
import java.io.PrintStream;
public class Test05
{
public Test05()
{
}
public static void main(String args[])
{
String s1 = "s";
String s2 = (new StringBuilder()).append(s1).append("r").toString();
String s3 = "sr";
System.out.println(s2 == s3);
}
}
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}