final、finally、finalize 区别

一般性概述:

 fianl 修饰 类、方法、变量 ,   修饰类即此类不可继承扩展,修饰方法则此方法不可重写override,修饰变量即变量不可修改

 finally 是java能保证重要代码一定要被执行的手段。一般try  finally   或 try catch  finally 联合使用,如进行连接释放、锁释放操作

  finalized 保证对象在被垃圾回收之前,完成对特定资源的回收,不推荐使用。

 

深入探讨:

final

java.lang包下我们可以发现相当一部分类被声明为final calss,第三方库中一些基础类同样如此,这样,可以有效的避免api的使用者随意更改基础功能,保证平台安全。

使用final修饰的变量 可以避免意外赋值编程错误。

fianl修饰的变量,可以保护只读数据,并发编程中,由于声明final变量,利于减少额外同步开销,省去一些不必要的防御性拷贝。

从开发角度,日常开发中,除非特殊的考虑,最好不要过度指望使用这种小技巧带来性能的好处,程序最好体现它的语义性为主。final不等同于immutable

final List<String> names = new ArrayList();
names.add("jack");
names.add("rows");
List<String> ages = List.of("13","14");
ages.add("19");

这段代码,final修饰的names这个引用不能被赋值,但是对象的行为不会受final影响,但是使用List.of方法创建的本身不可变List,最后add时,会抛异常。

finally

对于finally而言,至少需要了解一下比较偏门的情景:

   

try{
   System.out.print("go in try to do something");
   System.exit(1);
}finally{
   System.out.print("go to do finally thing");
}

这种场景,finally是不会被执行到的,因为程序已经被退出

对于finalize,首先它是不被推荐使用的,首先jvm中都会有对于的gc回收器,个人无法保证finalize何时会被执行,执行的是否符合预期,使用错误更可能会造成程序死锁或挂起或溢出

finalize 的执行和垃圾收集关联在一起,一旦实现非空的finalize方法,会导致相应对象回收速度降低,因为finalize设计在对象回收前调用,意味着实现finalize方法的对象比较特殊,jvm要对它进行额外处理,可以说此时finalize成为对象回收的障碍,如果finalize拖慢对象回收速度,会导致大量对象堆积而发生oom。

finalize 回收可能会生吞出错信息,造成更多回收的不可预测。

最好的优化方案是:资源用完显示释放 或 利用资源池对某些资源进行复用 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值