下面进一步探讨,什么样的string + 表达式会被编译器当成常量表达式?
这个String + String被正式是ok的,那么string + 基本类型呢?
String a = "a1"; String b = "a" + 1; System.out.println((a == b)); //result = true String a = "atrue"; String b = "a" + true; System.out.println((a == b)); //result = true String a = "a3.4"; String b = "a" + 3.4; System.out.println((a == b)); //result = true
|
可见编译器对string + 基本类型是当成常量表达式直接求值来优化的。
再注意看这里的string都是"**"这样的,我们换成变量来试试:
String a = "ab"; String bb = "b"; String b = "a" + bb; System.out.println((a == b)); //result = false |
这个好理解,"a" + bb中的bb是变量,不能进行优化。这里很很好的解释了为什么3的观点不正确,如果String+String的操作是在运行时进行的,则会产生新的对象,而不是直接从jvm的string池中获取。
再修改一下,把bb作为常量变量:
String a = "ab"; final String bb = "b"; String b = "a" + bb; System.out.println((a == b)); //result = true |
竟然又是true,编译器的优化好厉害啊!呵呵!考虑下面这种情况:
String a = "ab"; final String bb = getBB(); String b = "a" + bb; System.out.println((a == b)); //result = false private static String getBB() { return "b"; } |
看来Java(包括编译器和jvm)对string的优化,真的是到了极点了,string这个所谓的“对象”,完全不可以看成一般的对象,Java对string的处理近乎于基本类型,最大限度的优化了几乎能优化的地方。
另外感叹一下,string的+号处理,算是Java语言里面唯一的一个“运算符重载”(接触过c++的人对这个不会陌生)吧?
(编辑:aniston)
|