final、finally、 finalize 有什么不同
感觉这三者除了长得像也没啥可作为比较的,但是面试题中经常会出现这三者的比较,就简单总结一下。
1.final
final 可以用来修饰类、方法和变量,修饰类的时候表示类是不可以被继承的,修饰方法的时候表示方法不可以被重写,修饰变量的时候表示变量不可以被更改。
一般情况下,我们把方法或者类声明成final的时候就是为了告诉人们,这些行为不可以被更改,这在某种程度上也能够保证平台的安全性。能够有效的避免API的使用者修改一些特定的值。
下面的一段代码中,final 只能约束 strList 这个引用不可以被赋值,但是这个对象的行为却不会受到影响。
final List<String> strList = new ArrayList<>(); strList.add("Hello"); strList.add("world"); List<String> unmodifiableStrList = List.of("hello", "world"); unmodifiableStrList.add("again");
上面两行代码运行不会报错,运行结果为:
但是List.of()方法创建的是不可变的list,所以在add的时候会抛出异常。
2.finally
finally是java中为了保证重点代码一定被执行的一种机制。一般情况下,我们会使用try-fianlly,try-catch-finally来关闭流,关闭连接等操作。
几个fianlly中的代码不会被执行的特殊情况:
1. try-catch 异常退出。 try{ system.exit(1) }finally{ System.out.println(123); } 2. 无限循环 try{ while(ture){ System.out.println(123); } }finally{ System.out.println(456); } 3. 线程被杀死 当执行 try,finally 的线程被杀死时。finally 也无法执行。
fianlly在使用的过程中需要注意的就是:
1.不要在 finally 中使用 return 语句。
2.finally 总是执行,除非程序或者线程被中断
3.finalize
finalize 是基础类 java.lang.Object中的一个方法,用来回收资源,目的是为了保证对象在被垃圾回收之前完成特定资源的回收。但是在jdk9已经被标记deprecated了。也就是是说,这个方法并不推荐使用。之所以被废弃掉的原因在于不可控性,你无法控制finailize什么时候被执行,执行完成之后是否符合你的期望值。使用不当的话还有可能造成程序死锁,挂起等。
finalize被设计成在资源回收集之前调用,这也就是意味着对象如果实现了这个方法,jvm就需要对他做额外的处理。这样看来finalize本质上成为了快速回收的阻碍者,很可能会导致你的对象会经过好几个垃圾回收集才能被回收,而垃圾回收集的时间不可预测,这样会导致大量的资源被占用,消耗掉许多高频的资源。
那么与其使用finalize会导致系统性能下降,不如在资源使用完成之后显性释放掉或者利用资源池来进行复用。