首先,==判断的是内存地址值。看代码
String s = "ab",内存中有一个常量池,这句话就是将“ab”存入,常量池中,但将地址在暴露给s;
String s1 = "a";同理。
在看看常量池怎么用:如果常量池存在,就会直接引用,例如String s2 ="abc",String s3="abc",则s3直接指向常量池中的“abc”,s2==s3.
然后,String s2 = s1 + "b";这句代码是由StringBuilder中append方法中完成的。 append(String str方法):将指定的字符串追加到此字符序列。
执行过程是:注意,他不是在"b"的后面直接追加字符串。因为字符串是常量;它们的值在创建之后不能更改 所以,会将“b”存放在一个字符串生成器中,并在后面追加s对应的字符串,然后暴露地址值。
新开辟的空间存放的仍是“ab”,它会不会先去常量池找呢?不会,因为StringBuilder的调用过程是new一个新对象。而新创建的字符串不放入常量池中,他们有自己的地址空间。
|