面試刷題3:final finally finalize區別?

面試刷題3:final finally finalize區別?

我是李福春,我在準備面試。今天我們來回答下面的面試常見問題。

final finally finalize區別?

這三個貨只是單詞的寫法類似,實際的使用場景相差很大。

下面一一展開分析:

final

final修飾類,標識類不可被繼承,一定程度保證了提供出去的類的平臺安全性;

final修飾方法,標識方法不能被重寫;

final修飾變量,標識變量不能被修改;
在併發場景下可以帶來性能提升,因為可以較少額外的同步開銷和防禦性複製;

但是final不等同於Immutable;

如何實現一個Immutable類:
1.類使用final修飾;
2.成員變量都是private final;
3.構造方法使用深度copy方法賦值;
4.getter方法使用copy-on-write的方式賦值;

看下面的代碼,可以看到final和Immutable的區別;

<code>
//final只保證strlist無法再被賦值,但是可以添加,刪除元素等操作
final List<string> strList = new ArrayList<>();
strList.add("Hello");
strList.add("world");
//不變的集合中添加元素會報錯
List<string> unmodifiableStrList = List.of("hello", "world");
unmodifiableStrList.add("again");/<string>/<string>/<code>

finally

保證重點代碼一定會被執行的機制;

一般跟try-finally,try-catch-finally配套使用;

看下面的代碼,這是一個特例,finally裡面的語句不會被執行;

<code>try {
// do something
System.exit(1);
} finally{
System.out.println(“Print from finally”);
}/<code>

finalize

是Object類的一個方法,保證類在垃圾回收之前完成對特定資源的回收。

這貨很不靠譜,不建議被使用。(不可靠,使用不當容易引起程序死鎖,掛起)

替代方法有3種:

  1. cleaner替代;
  2. finally進行顯示的資源回收;
  3. 池技術實現資源的複用;

下面的代碼是一個使用Cleaner的例子:jdbc的資源回收用到了Cleaner,是利用幻想引用定製資源回收;

<code>
public class CleaningExample implements AutoCloseable {
// A cleaner, preferably one shared within a library
private static final Cleaner cleaner = <cleaner>;
static class State implements Runnable {
State(...) {
// initialize State needed for cleaning action
}
public void run() {
// cleanup action accessing State, executed at most once
}
}
private final State;
private final Cleaner.Cleanable cleanable
public CleaningExample() {
this.state = new State(...);
this.cleanable = cleaner.register(this, state);
}
public void close() {
cleanable.clean();
}
}/<cleaner>/<code>

小結

主要分別講了 final,finally,finalize的使用場景,各自無關聯;

面試刷題3:final finally finalize區別?


分享到:


相關文章: