用final声明的局部变量,能提升性能吗

用 final 声明的局部变量,能提升性能吗

在面试交流群中,有个群友问了我一个问题,这个问题也欢迎大家一起留言讨论,

Q:声明为 final 类型的局部变量,可以提升性能吗?

在 Java 中,声明为 final 的局部变量通常不会直接带来显著的性能提升。无论局部变量声明时带不带 final 关键字修饰,对其访问的效率都一样。

 

java

代码解读

复制代码

// 不带final int fun1() { int a = someValueA(); int b = someValueB(); return a + b; // 这里访问局部变量 } // 带final int fun2() { final int a = someValueA(); final int b = someValueB(); return a + b; // 这里访问局部变量 }

编译后的字节吗。

从图中可以看出带不带 final 的局部变量编译后的 Class 文件都是一样的,因此访问效率都是一样的。但有一个例外,声明为 final 的局部常量。

 

java

代码解读

复制代码

int fun1() { final int a = 2; // 声明常量a final int b = 3; // 声明常量b return a + b; // 常量表达式 }

在编译为常量时,会进行常量折叠,编译得到对应的字节码。

实际的效果和下面的代码类似。

 

java

代码解读

复制代码

int fun1() { return 5; }

那么用 final 声明的局部变量有什么作用吗?其实主要用于解决在匿名内部类中使用的外部局部变量时,该局部变量只能是用 final 声明的变量,主要有以下几个原因:

生命周期的不一致性

因为当方法执行结束时,方法内的参数和局部变量会跟着方法一起结束,都会被回收,而内部类的生命周期可能比方法长(例如:线程)。

如果允许修改外部局部变量,而外部方法已经结束,变量可能已经被回收,这会导致数据不一致和不可预测的结果。

通过将变量声明为 final,可以确保在匿名内部类中使用的变量值在其创建时就被固定下来,不会在后续发生变化。

数据一致性和线程安全

  • 由于匿名内部类可能会在不同的线程中被执行,如果允许修改外部局部变量,可能会引发线程安全问题。使用 final 变量可以保证在多个线程中看到的变量值是一致的。

  • 匿名内部类会复制外部局部变量的值。为了保证这个复制的值不会因为外部变量的修改而变得不一致,就要求外部变量是 final 的。

更多大厂面试题,欢迎前往微信搜索小程序「猿面试」查看。微信小程序(猿面试)包含了 Java、Android、鸿蒙和ArkTS设计模式算法和数据结构 相关内容,

Hi 大家好,我是 DHL,大厂程序员,公众号:ByteCode ,在美团、快手、小米工作过。搞过逆向,做过性能优化,研究过系统,擅长鸿蒙、Android、Kotlin、性能优化、职场分享。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值