作为Java开发也有些年了。一直对于String对象的使用 == 比较有些疑问点。
有人说,String这么简单的对象有什么好搞不清的。
事实上,还真的有些小复杂。
这里涉及到几个方面:
1. 常量
2. 对象
3. jvm编译期优化
下面以几种情况做测试,并尝试解释原因。
对象
String a = new String("i am String"); String b = new String("i am String");
这是初始化了两个对象,肯定指向不同地址。 a != b
常量
String a = "i am String"; String b = "i am String"; final String c = "i am String";
常量都放在常量池里,都是指向一个地址。 a = b = c
字符串拼接 (有final修饰)
final String a = "i am "; final String b = "String"; String c = a + b; String d = "i am String";
final String在JVM眼里是一个常量。在编译期间,JVM会把所有引用常量的代码替换成常量值。所以在程序编译完成之后程序是这样的
final String a = "i am "; final String b = "String"; String c = "i am String" String d = "i am String";
和常量的情况一样。c = d
字符串拼接 (无final修饰)
String a = "i am "; String b = "String"; String c = a + b; String d = "i am String";
这里a 和 b 不是常量,所以c的值需要在运行期间才能确定。运行期间会生成一个新的String对象。c != d