今天一个同事问我一道题目
我一看觉得全都应该是false, 因为string+string会要重新创建对象嘛,这个知道的。
结果在eclipse的运行结果却是:
true
false
true
觉得十分不解, 问同事为何?
回答是:对于第一个,在JAVA代码进行编译时,JAVA编译器已经将String b="a"+"b";优化成String b="ab"; 然后,因为JVM中对字符串的操作是在栈中,所以在运行是,发现栈中已经有了"ab"所以就直接引用。故第一个是TRUE。
-----------------------------------------------------------------------
看来是jvm对常量加法有优化,在编译器能直接得到结果
对于第二个,因为str是变量,所以
String str = "b";
String b = "a" + str;
就不能优化成b="ab";
对于第三个,很明显了, str声明成了final的, 又变成了常量
所以又能简化成b="ab"了
String a = "ab";
String b = "a" + "b";
System.out.println((a == b));这个的结果是什么?为什么?
String a = "ab";
String str = "b";
String b = "a" + str;
System.out.println((a == b));
这个的结果是什么?为什么?
String a = "ab";
final String str = "b";
String b = "a" + str;
System.out.println((a == b));
这个的结果是什么?为什么?
我一看觉得全都应该是false, 因为string+string会要重新创建对象嘛,这个知道的。
结果在eclipse的运行结果却是:
true
false
true
觉得十分不解, 问同事为何?
回答是:对于第一个,在JAVA代码进行编译时,JAVA编译器已经将String b="a"+"b";优化成String b="ab"; 然后,因为JVM中对字符串的操作是在栈中,所以在运行是,发现栈中已经有了"ab"所以就直接引用。故第一个是TRUE。
-----------------------------------------------------------------------
看来是jvm对常量加法有优化,在编译器能直接得到结果
对于第二个,因为str是变量,所以
String str = "b";
String b = "a" + str;
就不能优化成b="ab";
对于第三个,很明显了, str声明成了final的, 又变成了常量
所以又能简化成b="ab"了