Java字面量的相加类型转换
1、Java 编译期间(javac),凡是字面量和常量的运算,都会先运算出结果
2、运行期当字符串池中有 String"字面量"时,Java 会直接用,如果没有才创建,在以下代码中,在编译时运行的代码行会预先在String池中寻找字面量,
如果存在,就直接复用,不再创建。
在以下的demo中:
字符串 ss 进行的是变量运算,是在运行时执行,且产生了新对象。所以比较结果为false。
对于 s4 ,前3个char型被当成int 型进行运算,实际相加的是该字符的ASCII码值。所以结果为 150abc。
对于 s5 ,1虽然为int型,但加上String "abc" 后,又被强转成了String型。
对于 s6 ,前两个int值会在编译期间预先算出结果,所以最终s6=33abc。
而String s7和s8都进行了new操作,强制创建了新的字符串对象,开辟了新的内存空间,所以两个都为FALSE。
1 public class StaticStringDemo {
2 public static void main(String[] args) {
3
4 String s = "123abc";
5 String ss = s + ""; // 变量运算在运行期执行,产生新对象
6 String s1 = "123abc";
7 String s2 = "123" + "abc"; // 字面量运算在编译时优化
8 String s3 = "1" + "23" + "abc";
9 String s4 = '1' + '2' + '3' + "abc";// 结果为 150abc,因为前3个字符会被当做int进行加运算。
10 String s5 = 1 + "23abc";
11 String s6 = 1 + 2 + "3abc";
12 String s7 = new String("123abc");
13 String s8 = new String("123" + "abc");
14 System.out.println(s == s1); // true
15 System.out.println(s == ss); // false
16 System.out.println(s == s2); // true
17 System.out.println(s == s3); // true
18 System.out.println(s == s4); // false
19 System.out.println(s == s5); // true
20 System.out.println(s == s6); // false
21 System.out.println(s == s7); // false
22 System.out.println(s == s8); // false
23 // 注意:以上的 == 是比较变量的值是否相等或是否是同一个对象
25
26 }
27
28 }