无继承

  • 有 static 修饰

static final

static 非 final

结果

这里使用了 OpenJDK 的 JMH 基准测试工具来测试的,结果如下:

总结:你说final的性能比非final有没有提升呢?可以说有,但几乎可以忽略不计。如果单纯地追求性能,而将所有的方法修改为 final 的话,我认为这样子是不可取的。

而且这性能的差别,远远也没有网上有些人说的提升 50% 这么恐怖(有可能他们使用的是10年前的JVM来测试的吧^_^,比如 《35+ 个 Java 代码性能优化总结》这篇文章。雷总:不服?咱们来跑个分!)

分析

字节码级别的差别

StringKit.java StringKitFinal.java

它们在字节码上的差别:

可以看到除了方法名和方法修饰符不同之外,其他的没有什么区别了。

在调用者上面的字节码差别:

可以看到,它们在调用者上面的字节码也没有什么区别,只是方法名不一样之外。

对于 JVM 来说,它是只认字节码的,既然字节码除了方法名和修饰符一样,其他都一样,那就可以大概推测它们的性能几乎可以忽略不计了。因为调用 static final 和 static 非 final 的JVM指令是一样。

  • 无 static 修饰

方法体是一样的,只是将它们删除了 static 的修饰。

结果

分析

字节码级别的差别

可以看到,字节码上除了名字和 final 修饰符差别外,其余的是一样的。

在调用者上面的字节码差别

可以看到,它们除了名字不同之外,其他的JVM指令都是一样的。

总结

对于是否有 final 修饰的方法,对性能的影响可以忽略不计。因为它们生成的字节码除了 flags 标志位是否有 final 修饰不同之外,其他所有的JVM指令,都是一样的(对于方法本身,以及调用者本身的字节码都一样)。对于JVM来说,它执行的就是字节码,如果字节码都一样的话,那对于JVM来说,它就是同一样东西的了。

有继承

无 final 修饰

有 final 修饰

测试代码

写一个类来继承上面的抽象类,以此来测试在继承中 final 有否对多态中的影响

然后在基准测试中:

测试结果

  • 非 final 结果
  • 有 final 结果
  • 总对比

它们字节码的区别

可以看到,除了它们的方法签名和方法名字不同之外其他的都是一样的,包括JVM调用指令也完全是一样的。

结论

可以看到它们几乎是一样的。

总结

基于上面的基准测试结论,我认为滥用或刻意为了所谓的提升性能,而去为每一个方法尽可能添加 final 的关键字是不可取的。使用 final ,更多的应该是根据Java对 final 的语义来定义,而不是只想着为了提升性能(而且这影响可以忽略不计)而刻意用 final.

使用 final 的情况:

final 变量: 表示只读(只初始化一次,但可多次读取) final 方法:表示子类不可以重写。(网上认为 final 比非 final 快,就是认为它是在编译的时候已经静态绑定了,不需要在运行时再动态绑定。这个可能以前的JVM上是正确的,但在现代的JVM上,这个可以认为没什么影响,至少我在基准测试里是这样子) final 类: 它们不能被继承,而且final类的方法,默认也是 final 的。

关于这个 final 的性能问题,我也Google了下,发现 stackoverflow 上,也有类似的问题:

参考资料

https://www.javazhiyin.com/go?url=https://stackoverflow.com/questions/4279420/does-use-of-final-keyword-in-java-improve-the-performance

作者:emacsist

来源:java知音

the art of java 源代码_请不要再说Java中final方法比非final性能更好了相关推荐

  1. 解析java源代码_一步步解析java执行内幕

    对于任何一门语言,要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式.在本篇文章中,将重点研究java源代码的执行原理,即从程 序员编写JAVA源代码,到最终形成产品,在整个过 ...

  2. 兰顿蚂蚁 java源代码_兰顿蚂蚁-Java

    兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种. 平面上的正方形格子被填上黑色或白色.在其中一格正方形内有一只"蚂蚁". 蚂蚁的头部朝向为:上下左右其中一方 ...

  3. 斐波那契java编写_请编写一个Java程序的斐波那契数

    展开全部 class Fibonacci{ private int[] f; private int length; public Fibonacci(int length){ if(length&l ...

  4. java火山_火山代码转java源代码查看

    今天我们来研究一下火山安卓的源代码,火山安卓允许我们以本地化编程(中文代码编程)的方式来撰写安卓app,那么在生成实际要安装到安卓app的时候,它是如何进行编译处理的呢.让我们今天来一起探究一下. 首 ...

  5. 排序算法java源代码_排序算法汇总(java实现,附源代码)

    整理系统的时候发现了原来写的各种算法的总结,看了一下,大吃一惊,那时候的我还如此用心,具体的算法,有的已经模糊甚至忘记了,看的时候就把内容整理出来,顺便在熟悉一下,以后需要的时候就可以直接过来摘抄了. ...

  6. java 新建菜单选项_请完成下列Java程序:创建一个下拉式菜单,菜单项包括3个CheckboxM..._考试资料网...

    请完成下列Java程序:创建一个下拉式菜单,菜单项包括3个CheckboxMenultem(复选框),一条分割线和一个Exit项.要求打开或关闭复选框时,确定是哪个被切换,是开还是关,并输出它的状态: ...

  7. java简述常见的布局极其特点_请简要说明 Android 中五种常见布局的特点。_学小易找答案...

    [简答题]请简要说明有序广播和无序广播的区别 [简答题]请简要说明 Android 程序结构中 AndroidManifest.xml 的功能? [简答题]简述李村站人工办理进路的作业过程. [简答题 ...

  8. 心java源代码_写了一个心形图案的java源代码,想发给朋友,朋友怎样才能像打开文档一样方便查看呢?...

    搞清楚java的运行机制你就明白了该怎么办 java源代码->java编译器生成字节码文件->java虚拟机执行字节码文件->心形图案显示 因此你要让朋友直接运行,你就要让上述过程自 ...

  9. java输出GPA_请完成下列Java程序:实现换算GPA,对于学生学习的每一门课程,都输入两个..._考试资料网...

    问答题请完成下列Java程序:实现换算GPA,对于学生学习的每一门课程,都输入两个数据:考试成绩和学分,考试成绩按如下公式换算: 90-100:5 75-89: 4 60-74: 3 40-59: 2 ...

最新文章

  1. Springboot swagger2教程
  2. jquery 插件 任意位置浮动固定层
  3. network 学习笔记
  4. redhat6.5 yum register 问题
  5. JBoss5 启动报错java.lang.IllegalArgumentException: ...
  6. 全国计算机等级考试题库二级C操作题100套(第78套)
  7. You have unstaged changes.
  8. ubuntu16.04编译boost for Android(boost 1.65)
  9. 关于dev无法更新、调试的问题
  10. 说一说阿里云弹性公网IP那些事
  11. 数据库学习--wildfly配置postgreSQL数据源
  12. LeetCode Interleaving String
  13. 【反编译】apk反编译之修改贴吧发贴回帖时显示的地理位置
  14. 小甲鱼 C语言 19课 字符串的处理函数
  15. 大气层整合傻瓜包_【工具】switch大气层9.2系统升级固件+大气层0.10.3离线整合包...
  16. 腾讯和360之争之二
  17. 五一南京-无丝竹无案牍
  18. iOS自己总结的超级详细分解富文本大全(AttributedString),图文混排很轻松
  19. vue(移动端)使用高德地图实现精准定位
  20. java架构师培训班,太完整了!

热门文章

  1. 删除Kali Linux多余的系统架构
  2. dr.web for android version 9,DrWeb安全防护
  3. W ndoWs7更新怎么关闭,怎么样取消windows7自动更新
  4. springboot导入项目依赖报错_使用Spring Boot很简单,go!!!
  5. 最新研究 | 人类大脑皮质对有声调和非有声调语言的音高编码
  6. 蟑螂背上芯片板子,组队去救人类
  7. Nature子刊:用机器学习揭露人类基因调控背后的“语法”
  8. 苹果M1芯片升级果然很炸场:性能暴涨功耗速降!但最香新品竟是无降噪AirPods 3...
  9. 全球最大AI巨量模型,参数2457亿炼丹16天专注中文,打造者绝对让你意外
  10. Deepfake这次不换脸了,直接换了座城市