首页
学习
活动
专区
圈层
工具
发布
49 篇文章
1
美团面试:如何设计一个RPC框架?
2
美团面试:如何设计一个注册中心?
3
消息队列设计精要
4
Replication(上):常见的复制模型&分布式系统的挑战
5
Replication(下):事务,一致性与共识
6
网易面试:将Bean放入Spring容器中有几种方式?
7
MySQL慢查询之慢 SQL 定位、日志分析与优化方案
8
面试官:MQ 消息丢失、重复、积压问题,如何解决?
9
面试官:Spring中获取Bean有几种方式?
10
面试:你知道Java性能优化有哪些手段?
11
面试官:千万级数据,怎么快速查询?
12
面试官:你会哪些JVM调优参数?
13
面试官:如何设计一个 订单系统?
14
和面试官聊了半小时的MySQL索引!
15
121道分布式面试题和答案
16
数据库分库分表,何时分?怎样分?
17
一个单例模式,被问7个问题,难!
18
在线面试:如何设计一个秒杀系统?
19
Spring 为何需要三级缓存解决循环依赖,而不是二级缓存?
20
面试官:熟悉SQL优化吗?我只知道20种,其实远不止...
21
吐血整理 | Java并发编程 72 卷
22
面试官再问currentHashMap,就将这篇文章甩给他
23
保姆级教程,2万字详解JVM
24
这代码写的跟狗屎一样!怎么优化?19招搞定它
25
P7大佬压箱底的学习笔记
26
6000多字 | 秒杀系统设计注意点
27
动画+原理+代码+优化,解读十大经典排序算法
28
到底什么是重入锁?拜托,一次搞清楚!
29
面试官再问你 ThreadLocal,你就这样“怼”回去!
30
分布式锁:5个案例,附源码
31
美团面试:说说CAP,我的回答方式很特别
32
分布式事务 :可靠消息最终一致性方案
33
美团面试官:讲清楚MySQL结构体系,立马发offer
34
equals方法比较的是内容?谁告诉你的
35
我通过六个 MySQL 死锁案例,终于理解了死锁的原因
36
必知必会 RabbitMQ面试题 33道(附答案)
37
万字总结 MySQL核心知识,赠送25连环炮
38
那些年,面试被虐过的红黑树
39
小老弟用 案列 引出 ReentrantLock实现原理
40
五分钟说清楚 Spring Boot的自动配置原理
41
面试:Zookeeper常见11个连环炮
42
长文干货 | 手写自定义持久层框架!
43
怒肝一夜 | Mybatis源码深度解析
44
美女面试官问我:能说几个常见的Linux性能调优命令吗?
45
吊打面试官系列:final、finally、finalize 有什么区别?
46
面试官问:如何排除GC引起的CPU飙高?我脱口而出5个步骤
47
JVM真香系列:堆内存详解
48
电商项目实战:如何设计站内信
49
72道 并发编程 面试题!
清单首页面试文章详情

吊打面试官系列:final、finally、finalize 有什么区别?

final关键字

初级回答

final ,是修饰符关键字。

  • 修饰类,表示该类不能在被继承。
  • 修饰方法,表示该方法不能被子类重写。
  • 修饰变量,表示该变量是常量,不能被修改。

中高级回答

  • 如果一个类被声明为 final ,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract 的,又被声明为 final 的。
  • 将变量或方法声明为 final ,可以保证它们在使用中不被改变。被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为 final 的方法也同样只能使用,不能重写。

另外,在早期的 Java 实现版本中,会将 final 方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的 Java 版本已经不需要使用 final 方法进行这些优化了)。类中所有的private 方法都隐式地指定为 final

String 、Integer、Long等类都是final修饰的类。其保存值的属性也是final修饰的。

final修饰基本数据类型和修饰引用数据类型。

如果final修饰的是一个基本数据类型的数据,一旦赋值后就不能再次更改 ,而对于引用类型变量而言,它仅仅保存的是一个引用,final只保证这个引用类型变量所引用的地址不会发生改变,即一直引用这个对象,但这个对象属性是可以改变的。

finally关键字

初级回答

通常放在try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,可以将释放外部资源的代码写在finally块中。

使用方式:

代码语言:javascript
复制
try{
 //业务代码
}catch(){
//异常处理
}finally{
//释放资源等
}

try{
 //业务代码
}finally{
//释放资源等
}

高级回答

在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。

通常在处理一些资源的时候,会使用finally来关闭相关资源。比如说:操作文件,使用ReentrantLock锁,分布式锁等。

在以下 4 种特殊情况下,finally块不会被执行:

  • finally 语句块中发生了异常。
  • 在前面的代码中用了 System.exit() 退出程序。
  • 程序所在的线程死亡。
  • 关闭 CPU 。

finalize方法

finalize ,是方法名。

初中级级回答

Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。

听到这里就知道这面试题答案是背的

高级回答

Java 允许使用 #finalize() 方法,在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。

  • 它是在 Object 类中定义的,因此所有的类都继承了它。
  • 子类覆盖 finalize() 方法,以整理系统资源或者执行其他清理工作。
  • #finalize() 方法,是在垃圾收集器删除对象之前对这个对象调用的。

这个方法在工作中最好别用,如果用了可能会带来意想不到的难题,一般情况下,我们在业务中不会自己实现这个方法 。

大致过程:

  • 垃圾回收器发现该对象实现了finalize()方法。因为会把它添加到java.lang.ref.Finalizer.ReferenceQueue队列中。
  • Finalizer线程会处理这个队列,将里面的对象逐个弹出,并调用它们的finalize()方法。
  • finalize()方法调用完后,Finalizer线程会将引用从Finalizer类中去掉,因此在下一轮GC中,这些对象就可以被回收了。
  • Finalizer线程会和我们的主线程进行竞争,不过由于它的优先级较低,获取到的CPU时间较少,因此它永远也赶不上主线程的步伐。
  • 程序消耗了所有的可用资源,最后抛出OutOfMemoryError异常。
下一篇
举报
领券