21
【Q】: 什么是Java的SPI機制?
【A】:
- SPI 是一種插件機制,用于在運行時動態加載服務的實現。它通過定義接口(服務接口)并提供一種可擴展的方式來讓服務的提供著(實現類)在運行時注入,實現解耦和模塊化設計。
- SPI機制的核心概念:
- 服務接口:接口或抽象類,定義某個服務的規范或功能。
- 服務提供者:實現了服務接口的具體實現類。
- 服務加載器:Java提供的工具類,負載動態加載服務的實現類。提供ServiceLoader可以在運行時發現和加載多個服務提供者。
- 配置文件:服務提供者通過在META-INF/services/目錄下配置服務接口的文件來聲明自己。這些文件的內容是實現該接口的類的完全限定名。
- SPI機制的優勢:
- 解耦:接口與實現分類,客戶端不需要依賴具體實現,能夠在運行時靈活加載不同的實現類。
- 可擴展性:提供了一種易于擴展的機制,允許后期添加或替換實現類,而不需要修改現有的代碼。
22
【Q】:Java泛型的作用是什么?
【A】:
- Java泛型的作業是通過編譯時檢查類型安全,允許程序員編寫更通用和靈活的代碼,避免在運行時發現類型轉換錯誤。
- 作用:
- 類型安全:泛型運行在編譯時進行類型檢查,確保在使用集合或者其他泛型類時,不會出現類型不匹配的問題,減少了運行時的
ClassCastException
錯誤。 - 代碼重用:泛型使代碼可以適用于多種不同的類型,減少代碼重復,提升可讀性和維護性。
- 消除顯式類型轉換:泛型允許在編譯時指定類型參數,從而消除了運行時需要顯示類型轉換的麻煩。
- 類型安全:泛型運行在編譯時進行類型檢查,確保在使用集合或者其他泛型類時,不會出現類型不匹配的問題,減少了運行時的
23
【Q】:Java泛型擦除是什么?
【A】:
- 泛型擦除指Java編譯時將所有泛型信息刪除的過程,以確保與Java1.4之前的版本保存兼容。泛型參數在運行時會被替換為其上界(通常是Object),這樣一來在運行時無法獲取的實際類型。
- 作用:泛型擦除確保了Java代碼的向后兼容性,但它也限制了在運行時對泛型類型的操作。
- 運行:由于類型擦除,無法在運行時獲取泛型的實際類型,也不能創建泛型類型的數組或對泛型類型使用 。
24
【Q】:什么是Java泛型的上下界限定符?
【A】:
- 用于對泛型類型參數進行范圍限制,主要有上界限定符和下界限定符。
- 上界限定符(?extends T):
?extends
T表示通配符類型必須是T類型或T類型的子類。允許使用T或其子類型作為泛型參數,通常用于讀取操作,確保可以讀取為T或T的子類的對象。 - 下界限定符(?super T):?super T表示通配符類型必須是T類型或T類型的父類。允許使用T或其父類型作為泛型參數,通常用于寫入操作,確保可以安全地向泛型集合中插入T類型的對象。
25
【Q】:Java中的深拷貝和淺拷貝有什么區別?
【A】:
- 深拷貝:不復制對象本身,還遞歸復制對象中所有引用的對象。這樣新的對象與原對象完全獨立。
- 淺拷貝:只復制對象的引用,而不復制引用指向的實際對象。淺拷貝創建一個新的對象,但它的字段(若是對象類型)指向的是原對象中的相同內存引用。
26
【Q】:什么是Java的Integer緩存池?
【A】:
- Java的
Integer
緩存池:為了提升性能和節省內存。根據實踐發現大部分的數據操作都集中在值比較小的范圍,因為緩存這些對象可以減少內存的分配和垃圾回收的負擔,提升性能。 - 在
-128
~127
范圍內的Integer
對象會被緩存和復用。 - Java在自動裝箱時,對于值在
-128
~127
之間的int
類型,會直接返回一個已經緩存的integer
對象,而不是創建新的對象。 - 緩存池的使用場景:當基本數據類型
int
轉化為包裝類型Integer
時,若數值在緩存范圍內,返回緩存對象;由于相同范圍內的整數使用同一個緩存對象,使用==
可以正確比較它們的地址(引用相同),而不需要使用equals
。但是要注意對于超過范圍的Integer
對象,==
比較的是對象引用,而不是數值。要比較數值,應使用equals
方法。
27
【Q】:Java中的類加載過程是怎么樣的?
【A】:
- 是把類加載到JVM中,把二進制流存儲到內存中,之后經過一番解析、處理轉化成可用的class類。二進制流可用來源于class文件,或通過字節碼工具生成的字節碼或來自網絡。只要符合格式的二進制流,JVM來著不拒。
- 類加載流程分為:加載、連接(驗證、準備、解析)、初始化。
28
【Q】:什么是Java中的BigDecimal?
【A】:
- 是Java中提供的一個用于高精度計算的類,屬于java.math包。對浮點數和定點數的精確控制。
- 高精度:可以處理任何精度的數值,而不像float和double存在限制。
- 不可變性:所有算術運算都會返回新的BigDecimal對象,而不會改原有對象。
- 豐富的功能:提供了較多方法,支持各種舍入模式。
29
【Q】:BigDecimal為什么可以保證精度不丟失?
【A】:
- 使用了任意進度的整數表示伐,而不是浮動的二進制表示,
- 內部使用兩個字段存儲數字,一個是整數部分
intVal
,另一個是用來表示小數點的位置scale
,避免了浮點數轉化過程中可能的精度丟失。
30
【Q】:new String(“”)會創建多少個對象?
【A】:
- 會創建1個或2個字符串對象。
- 如果字符串常量池中不存在對象的引用,那么它會在堆上創建兩個字符串對象,其中一個字符串對象的引用會被保存在字符串常量池中。