常量优化机制:给一个变量赋值,如果等于号的右边是常量的表达式并且没有一个变量,那么就会在编译阶段计算该表达式的结果,然后判断该表达式的结果是否在左边类型所表示范围内,如果在,那么就赋值成功,如果不在,那么就赋值失败。但是注意如果一旦有变量参与表达式,那么就不会有编译期间的常量优化机制
byte b1 = 1+3;
byte b2 = 127+1;//错误
long l1 = 3000000000;//错误
long l2 = 30000000000L;
byte b3 = 10;
b3 = b3+2;//错误
String s1 = "abc";
String s2 = "abc";
System.out.println(s1==s2);//true
String s3 = "ab"+"c";
System.out.println(s2==s3);//true
String s4 = "a";
String s5 = s4+"bc";
System.out.println(s2==s5);//false
@Test
public void test3(){
String str1 = "hello";
String str2 = "java";
String str3 = "hellojava";
String str4 = "hello" + "java";//常量与常量拼接,还是常量
String str5 = "hello" + str2;//常量与变量拼接,结果在堆中
String str6 = str1 + str2;//变量与变量拼接,结果也在堆中
System.out.println("str3 == str4 " + (str3 == str4));//true
System.out.println("str3 == str5 " + (str3 == str5));//false
System.out.println("str3 == str6 " + (str3 == str6));//false
final String str7 = "hello";
final String str8 = "java";
String str9 = str7 + str8;//常量与常量拼接
System.out.println("str3 == str9 " + (str3 == str9));//true
String str10 = (str1 + str2).intern();//intern()的结果放常量池
System.out.println(str3 == str10);//true
}