当时发现这一点之后,我可能是中毒了,给能加上final的地方都加上了,自以为改善了性能心里还美滋滋呢。其实对这个“提升性能”一点一直还有一丝的疑问,于是我回头就去了Stack Overflow上转了一圈,找到了我想要的答案:Does use of final keyword in Java improve the performance?
大佬指出,通常是不会的,对于方法,HotPot会跟踪看它是否真的被重写了,并且能够优化没有被重写的内敛方法,直到它加载到了一个类复写了这个方法,这时它可以撤销(或部分撤销)这些优化。(当然,这是假设您使用的是HotPot,但到目前为止这是最常见的JVM,所以…)
之后大佬指出了我们不应该为了这么丝许的性能而绞尽脑汁,建议我们应该明确设计,写出好的结构的代码以及可读性优良的代码。(在此又应证了《Effective Java》中的第55条:谨慎地进行优化中所指出的核心:优化的格言就是:不要进行优化) (也验证了上面《Java编程思想中最后的那句话》)
3.关于局部变量以及参数中的final
接着我尝试将我的局部变量以及方法中的参数都标记为final的,同2一样,已经中毒颇深了。但是我对此同时也存在着同样的疑问,然后在Stack Overflow中得到了经验证的又一个结论:局部变量以及参数中的final,同样不能提升我们的性能,它甚至不会被写进字节码中。于是我操起了键盘啪啪啪一顿敲了几行代码编译了一下,并用反编译工具(如JD-GUI)打开:
先来看我们的源码:
public class FinalTest { private static void say(final int number) { System.out.println("number: " + number); } public static void main(String[] args) { final int num = 0; say(num); } }