感觉这三者除了长得像也没啥可作为比较的,但是面试题中经常会出现这三者的比较,就简单总结一下。

        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");

  上面两行代码运行不会报错,运行结果为:

final、finally、 finalize 有什么不同_垃圾回收

  但是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会导致系统性能下降,不如在资源使用完成之后显性释放掉或者利用资源池来进行复用

唯有热爱方能抵御岁月漫长。