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 回收可能會生吞出錯資訊,造成更多回收的不可預測。
最好的優化方案是:資源用完顯示釋放 或 利用資源池對某些資源進行復用