Java中的字符串是常量
public class Stringtest {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
String s3 = "hello";
String s4 = "hello"+"world";
String s5 = "helloworld";
String s6 = s1 + s2;
//==号比较的是两个引用指向的地址是否相同,
//s1 == s3为true表明s1和s3这两个引用指向同一个地址,
//即String s1 = "hello"; 这条语句创建了"hello"常量,
//在String s3 = "hello"; 这条语句只是将s3指向了s1创建的"hello",而不是再创建一个"hello"。
System.out.println(s1 == s3); //运行结果:true
//同理,String s4 = "hello"+"world";这条语句拼接了一个"helloworld"常量,
//String s5 = "helloworld";这条语句直接把s5指向以上的"helloworld"常量,而不是再创建一个。
System.out.println(s4 == s5); //运行结果:true
//s6由s1和s2两个变量拼接而成,虽然结果也是"helloworld",但由于是由变量拼接而成,所以不会指向s4创建的"helloworld".而是创建一个新的"helloworld"并让s6指向它。
System.out.println(s5 == s6);//运行结果:false
}
}
s4和s6的不同:
编译器在编译的时候只能确定常量的值,所以String s4 = "hello"+"world";这条语句在编译的时候,由于编译起知道"hello"和”world“这两个常量的值,编译时就已经直接替代为了:String s4 = "helloworld";
而String s6 = s1 + s2;这条语句,因为s1、s2是变量,编译器无法确定变量的值(因为变量的值会变,编译起无法保证在运行过程中s1,s2的值恒定),这条语句在编译完成后并不做修改。所以会在运行的时候重新创建一个"helloworld"(与上面s4指向的"hellloworld”并不是同一个),并将s6指向它。
————————————————
版权声明:本文为CSDN博主「FakeMonk_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39108629/article/details/100178650