1.包裝類型的緩存機制了解么?
指部分包裝類在創建對象時,會將一定范圍內的對象緩存起來,當再次使用相同值創建對象時,優先從緩存中獲取,而不是重新創建新對象。【提高性能】【節省內存】
列舉幾個常見的包裝類緩存機制:
(1)Integer
?類在?-128
?到?127
?這個范圍內有緩存機制。當使用?Integer.valueOf(int)
?方法創建?Integer
?對象時,如果值在這個范圍內,會直接從緩存中獲取對象,否則會創建新對象。
Integer a = Integer.valueOf(100);
Integer b = Integer.valueOf(100);
System.out.println(a == b); // 輸出 true,因為從緩存中獲取的同一個對象Integer c = Integer.valueOf(200);
Integer d = Integer.valueOf(200);
System.out.println(c == d); // 輸出 false,因為值不在緩存范圍內,創建了新對象
(2)Byte
、Short
?和?Long
?類也有類似的緩存機制,緩存范圍都是?-128
?到?127
。
Byte byte1 = Byte.valueOf((byte) 10);
Byte byte2 = Byte.valueOf((byte) 10);
System.out.println(byte1 == byte2); // 輸出 trueShort short1 = Short.valueOf((short) 100);
Short short2 = Short.valueOf((short) 100);
System.out.println(short1 == short2); // 輸出 trueLong long1 = Long.valueOf(120L);
Long long2 = Long.valueOf(120L);
System.out.println(long1 == long2); // 輸出 true
(3)Character
?類會緩存從?\u0000
?到?\u007F
(即?0
?到?127
)的字符對象。
Character char1 = Character.valueOf('A');
Character char2 = Character.valueOf('A');
System.out.println(char1 == char2); // 輸出 true
(4)Boolean
?類會緩存?true
?和?false
?兩個對象。
Boolean bool1 = Boolean.valueOf(true);
Boolean bool2 = Boolean.valueOf(true);
System.out.println(bool1 == bool2); // 輸出 true
【注意】只有使用?valueOf
?方法創建對象時才會觸發緩存機制,如果使用?new
?關鍵字創建對象,無論值是否在緩存范圍內,都會創建新對象。
2. 自動裝箱與拆箱了解嗎?原理是什么?
Java的自動裝箱和拆箱是Java 5 引入的,主要用于簡化基本數據類型和對應的包裝類之間的轉換操作。
自動裝箱:指基本類型自動轉換成對應的包裝類對象。如 int 自動轉 Integer。
自動拆箱:指包裝類對象自動轉換成對應的基本類型。如 Integer自動轉int。
// 自動裝箱
int num1 = 10;
Integer num2 = num1;// 自動拆箱
Integer num3 = 20;
int num4 = num3;
自動裝箱和拆箱的原理:
自動裝箱原理:在編譯階段,編譯器會調用包裝類的valueOf()方法來實現自動裝箱。
例如,上述代碼中的Integer num2 = num1;
在編譯后實際上會變成Integer num2 = Integer.valueOf(num1);。
自動拆箱:在編譯階段,編譯器會調用包裝類的xxxValue()方法來實現自動拆箱。
像int num4 = num3;
在編譯后會變為int num4 = num3.intValue();。
包裝類的緩存機制,又在這里得到了驗證。
3. 淺拷貝和深拷貝區別了解嗎?什么是引用拷貝?
淺拷貝、深拷貝和引用拷貝是三種不同的對象復制方式。
(1)引用拷貝僅僅是復制對象的引用,而不會創建新的對象。也就是說,原對象和復制后的對象都指向內存中的同一個實例。因此,對其中一個對象的修改會反映到另一個對象上。
(2)淺拷貝會創建一個新的對象,然后將原對象的非靜態字段復制到新對象中。如果字段是基本數據類型,就直接復制其值;如果字段是引用類型,只復制引用,而不復制對象本身。這意味著原對象和淺拷貝對象中的引用類型字段會指向同一個對象(也就是說原對象的內部類會直接引用)。
要實現淺拷貝,可以讓類實現?Cloneable
?接口并重寫?clone()
?方法。
(3)深拷貝同樣會創建一個新的對象,并且會遞歸地復制原對象的所有字段,包括引用類型的字段。這意味著原對象和深拷貝對象中的引用類型字段指向不同的對象,對一個對象的修改不會影響到另一個對象。
要實現深拷貝,可以通過序列化和反序列化來完成,也可以手動遞歸地復制所有引用類型的字段。
4. 談談對 Java 注解的理解,解決了什么問題?
注解可以看作是一種特殊的標記,它可以應用于包、類、方法、字段等元素上,以提供額外的信息。注解通過?@
?符號來標識,例如?@Override
、@Deprecated
?等。Java 提供了一些內置的注解,同時開發者也可以自定義注解。
注解解決的問題:
(1)編譯時檢查:編譯器會檢查被?@Override
?注解標記的方法是否真的重寫了父類的方法,如果沒有則會報錯。這樣可以避免因方法名拼寫錯誤或方法簽名不匹配而導致的潛在問題。
(2)代碼生成:在一些框架中,注解可以用于生成代碼。如 Lombok?
(3)配置信息管理:注解可以用于替代傳統的配置文件,將配置信息直接嵌入到代碼中。例如,Spring 框架使用?@Component
、@Service
、@Repository
?等注解來標識組件,將組件的配置信息與代碼緊密結合,提高了代碼的可維護性。
(4)運行時信息的獲取:通過反射機制,在運行時獲取注解的信息,并根據這些信息執行相應的操作。例如,JUnit 框架使用?@Test
?注解來標記測試方法,在運行測試時,JUnit 會通過反射查找所有被?@Test
?注解標記的方法并執行。
5. Exception 和 Error 有什么區別?
Exception
?和?Error
?都繼承自?Throwable
?類
Exception
?表示程序運行時可能出現的可處理的異常情況。開發人員能夠通過捕獲和處理這些異常。
Error
?表示系統級別的錯誤。通常是由 JVM或者底層系統出現問題引發的。
應用場景
- Exception:
- 受檢查異常:在編譯時就需要被處理的異常,若不處理,程序將無法通過編譯,例如?
IOException
、SQLException
?等。 - 運行時異常:編譯時不需要強制處理,例如?
NullPointerException、
ArrayIndexOutOfBoundsException
?等。
- 受檢查異常:在編譯時就需要被處理的異常,若不處理,程序將無法通過編譯,例如?
- Error:一般是系統級的錯誤,常見的有?
OutOfMemoryError
、StackOverflowError
?等
6. Java 反射?反射的缺點?反射的應用場景?
?反射是什么?
反射(Reflection)是 Java 提供的一種動態機制,允許程序在運行時獲取類的元數據(如類名、方法、字段、構造器等),并動態操作類或對象(如實例化對象、調用方法、訪問私有成員等)。其核心是通過?Class
?對象實現,關鍵 API 包括:
-
Class
?類:表示類的元數據。 -
Method
、Field
、Constructor
:分別表示方法、字段和構造器。
示例:通過類名動態創建對象:
Class<?> clazz = Class.forName("com.example.User");
Object user = clazz.newInstance();
反射的缺點
-
性能開銷:反射調用涉及動態解析和 JVM 優化限制(如無法內聯方法),性能比直接調用低。但通過緩存?
Method
?對象或使用?setAccessible(true)
?關閉安全檢查可緩解。 -
破壞封裝性:可訪問私有成員(如?
private
?方法或字段),可能導致代碼安全隱患。 -
代碼復雜度:反射代碼冗長,需處理大量異常(如?
ClassNotFoundException
),降低可讀性和維護性。 -
兼容性風險:反射依賴類的內部細節(如方法名、參數列表),若類結構變更(如版本升級),反射代碼可能失效。
-
泛型擦除:反射無法直接獲取泛型類型信息(如?
List<String>
?在運行時變為?List
)。
?反射的應用場景
-
框架開發:
-
Spring 依賴注入:通過反射實例化 Bean 并注入屬性。
-
ORM 框架(如 Hibernate):將數據庫結果映射到 Java 對象。
-
動態代理(如 AOP):生成代理類攔截方法調用。
-
-
序列化/反序列化:如 Jackson 通過反射讀取對象字段生成 JSON。
-
測試工具:JUnit 使用反射調用測試方法。
-
插件化架構:動態加載類(如通過配置文件的類名實例化對象)。
-
IDE 和調試工具:實時獲取對象信息(如變量值、方法列表)。
7. Java 泛型了解么?什么是類型擦除?介紹?下常?的通配符?
Java泛型&通配符