主要是对比字面型常量之间、变量之间以及两者之间运算在编译后的差异
源代码:
int a=1+2;
System.out.println(a);
int b=10;
int c=20;
int d=a+b;
System.out.println(d);
.class文件反编译
int a = 3;
System.out.println(a);
int b=10;
int c=20;
int d=a+b;
System.out.println(d);
源代码:
String str1 = "abcd"; // 直接赋值
String str2 = new String("1234"); // 使用标准的new调用构造方法
String str6="ab"+"cd";
String str7="ab";
String str8="cd";
String str9=str7+str8;
.class文件反编译
String str1 = "abcd";
String str2 = new String("1234");
String str6 = "abcd";
String str7 = "ab";
String str8 = "cd";
String str9 = (new StringBuilder(String.valueOf(str7))).append(str8).toString();
源代码:
public class Test02 {
public static final String A = "ab";
public static final String B = "cd";
public static final String C;
public static final String D;
static {
C = "ab";
D = "cd";
}
public static void main(String[] args) {
String ssss = A + B;
System.out.println(ssss == t);// true
System.out.println((C + D) == t);// false
}
.class文件反编译:
public class Test02
{
public static final String A = "ab";
public static final String B = "cd";
public static final String C = "ab";
public static final String D = "cd";
public Test02()
{
}
public static void main(String args[]){
String ssss = "abcd";
System.out.println(ssss == t);
System.out.println((new StringBuilder(String.valueOf(C))).append(D).toString() == t);
}
源代码:
String s2 = "cd";
String ss = "ab" + s2;
.class文件反编译:
String s2 = "cd";
String ss = (new StringBuilder("ab")).append(s2).toString();
总结:
- 两个字面型常量(非字符型)相加减乘除,编译期会运算出结果
- 两个字符型常量相加,编译期就会进行拼接得出结果
- 一个字面型常量(非字符型)和一个变量(非字符型)相加减乘除,编译期是不做处理的
- 两个字符串类型的变量相加,或者一个字面型常量(字符串类型)和一个变量(字符串类型)相加编译期会进行StringBuilder的包装处理,但是不会得出结果
注意: 单独的int a=10;但是a后面并没有使用,编译后还是会有int a=10;存在的
进一步结论:
- 只有当两个字面型常量直接运算时,会在编译期得出结果
不懂或者总结不全的地方,就自己敲代码实践一下吧!