在java中,当编译器将源代码转化为字节码时,会对源代码进行相应的优化操作,具体可以总结为以下几点
tips:泛型与类擦除
java中的泛型是只存在于源代码中的,在已经编译后的字节码文件里,已经替换为了原来的原生类型,并在相应的地方擦除了强制转换代码,在运行中ArrayList与ArrayList是同一个类,尽管在源代码中是不同的泛型
1对常量的操作
(1)如果一个表达式E已经被计算过,而且从先前到现在E中的值没有变化,E会成为公共表达式并且不会再次计算,直接调用之前的结果。
(2)String +常量表达
String a = "a"+"b";
String b = "a"+1;
会被自动优化成
String a ="ab";
Strng b ="a1";
(3)常量替换
final int N =1;
int n=N;
会变成
int N =1;
int n =1;
(4)某些常量计算也会直接算出
int n = 1+1;
会变成
int n =2;
(5)确定的结果也会折叠
boolean f = true||(a&&b||c);
会变成
boolean f =true;
2.数组边界检查消除
如果在一段关于数组的操作中,明显可以确定操作不会越界的话,编译器会把多余的数组越界的检查操作给除掉。
3 逃逸分析
如果一个方法被定下以后,它可能被外部方法给引用,则被称为方法逃逸,被外部线程访问访问到则被称为线程逃逸
,如果可以确定一个方法不会发生方法逃逸或者线程逃逸,编译器会试着通过栈上分配、同步消除、标量替换等手段优化,尽量使得其中使用的局部对象在栈上方法结束后就被销毁。