我们都应该知道,new出来的对象会放在堆中分配空间,string 也是一样:string s = new string("s");
而string直接引用的值都放在常量池中,但对string类型的“+”运算值得弄清楚:
public static void test1() { string s = "ab"; string a = "a" + "b"; system.out.println(s == a);//这里 true。 }
jvm对字符串常量的"+"运算,在编译期完成。在常量池中的值赋给各个变量的引用!在编译期即把字符串常量的值确定下来!
public static void test2() { string s = "ab"; string a = "a"; string b = a + "b"; system.out.println(s == b);//这里 false; }
jvm对字符串引用的“+”运算,如果有字符串引用的存在,在编译期无法确定引用的值指向。只有在程序运行期通过动态分配并将链接后的地址赋予。 如果string a = "a" 换成 final string a = "a"那么返回的就是true。有了final修饰后,它在编译时被
解析为常量值的一个本地拷贝存储到自己的常量池中或嵌入到它的字节码流中,所以和"a" + "b"是相同的效果!
注意 只有在编译期确定下来相同的值后方能 == 。这里的操作都在常量池中进行!不同于new出来的string !