面試 Java 基礎八股文十問十答第十五期
相信看了本文後,對你的面試是有一定幫助的!關注專欄後就能收到持續更新!
⭐點贊⭐收藏⭐不迷路!⭐
1)為什麼 String 是不可變的?
String 是不可變的主要有以下幾個原因:
- 安全性: 不可變性可以確保字符串的內容在創建後不能被修改。這對於一些安全性敏感的操作(例如密碼、網絡連接等)是很重要的,因為字符串不可變性可以防止在使用過程中的意外修改。
- 線程安全性: 不可變性使得字符串在多線程環境下更容易管理。多個線程可以同時訪問一個字符串對象,而無需擔心對象被修改。
- 緩存哈希值: 不可變字符串的哈希值在創建時可以進行緩存,因為它們永遠不會改變。這在需要頻繁計算哈希值的場景中提供了性能優勢。
- 字符串池: 由於字符串是不可變的,可以被存儲在字符串池中,以便在程序中共享。這可以減少內存佔用,提高性能。
2)String 真的是不可變的嗎?
儘管 String 被設計為不可變的,但通過反射機制和一些特殊處理,可以在運行時進行修改。這不是一個推薦的做法,因為它違背了字符串不可變性的設計原則,並可能導致不可預測的行為。
3)是否可以繼承 String 類?
在 Java 中,String 類是 final 類,因此不能被繼承。final 關鍵字表示該類不能被其他類繼承。這是為了確保字符串的不可變性和安全性。如果 String 類可以被繼承,那麼子類可能會修改字符串的內容,從而破壞了字符串的不可變性。如果需要擴展字符串的功能,可以使用其他相關的類,比如 StringBuilder 或 StringBuffer,它們提供了可變的字符串操作。
4)數組有沒有 length() 方法?
在 Java 中,數組是一種特殊的對象,它具有一個名為 length 的屬性,用於獲取數組的長度。注意,length 是一個屬性而不是方法,因此不需要使用括號來調用。
int[] arr = {1, 2, 3, 4, 5};
int length = arr.length;
System.out.println("數組的長度為:" + length);
5)String 有沒有 length() 方法?
是的,String 類有一個名為 length() 的方法,用於獲取字符串的長度,即字符串中字符的數量。
String str = "Hello, World!";
int length = str.length();
System.out.println("字符串的長度為:" + length);
6)String 類的常用方法都有哪些?
String 類提供了許多常用的方法來操作字符串,其中一些包括:
length():返回字符串的長度(字符的數量)。charAt(int index):返回指定索引位置的字符。substring(int beginIndex):返回從指定索引開始到字符串末尾的子字符串。substring(int beginIndex, int endIndex):返回從指定開始索引到結束索引之間的子字符串。indexOf(String str):返回指定子字符串在當前字符串中第一次出現的位置索引。indexOf(String str, int fromIndex):返回指定子字符串從指定位置開始在當前字符串中第一次出現的位置索引。lastIndexOf(String str):返回指定子字符串在當前字符串中最後一次出現的位置索引。lastIndexOf(String str, int fromIndex):返回指定子字符串從指定位置開始在當前字符串中最後一次出現的位置索引。startsWith(String prefix):檢查字符串是否以指定的前綴開頭。endsWith(String suffix):檢查字符串是否以指定的後綴結尾。toLowerCase():將字符串中的所有字符轉換為小寫。toUpperCase():將字符串中的所有字符轉換為大寫。trim():去除字符串兩端的空白字符。replace(char oldChar, char newChar):將字符串中所有的舊字符替換為新字符。
這些只是 String 類中的一部分常用方法,還有許多其他方法可以用於字符串操作。
7)在使用 HashMap 的時候,用 String 做 key 有什麼好處?
使用 String 作為 HashMap 的 key 有以下好處:
- 不可變性保證安全性: String 是不可變的,因此它的哈希值在創建時就確定,並且在整個生命週期內不會發生變化。這確保了在 HashMap 中使用 String 作為 key 時的穩定性和安全性,避免了哈希值變化導致的不一致性。
- 哈希值的緩存: String 類在創建時會計算並緩存其哈希值,因為它是不可變的,所以這個緩存的哈希值是安全的。在 HashMap 中使用 String 作為 key 可以直接利用這個緩存的哈希值,提高了獲取 key 的哈希值的性能。
- 易於讀取: 作為字符串,HashMap 中使用的 String key 可以直觀地表示,易於理解和調試。
綜上所述,使用 String 作為 HashMap 的 key 可以確保穩定性、安全性,並提高性能。
8)String 和 StringBuffer、StringBuilder 的區別是什麼?String 為什麼是不可變的?
- String: String 類是不可變的,意味着一旦創建就不能被修改。每次對 String 進行操作時,都會創建一個新的字符串對象,原對象不會被修改。String 的不可變性主要基於以下原因:
- 安全性:不可變性可以確保字符串的內容在創建後不能被修改,這對於安全性敏感的操作是很重要的。
- 線程安全性:不可變性使得字符串在多線程環境下更容易管理。
- 緩存哈希值:不可變字符串的哈希值在創建時可以進行緩存,提高了性能。
- StringBuffer 和 StringBuilder: StringBuffer 和 StringBuilder 類是可變的,它們支持對字符串進行動態修改。主要區別在於線程安全性,StringBuffer 是線程安全的,而 StringBuilder 不是。這是因為 StringBuffer 的方法使用了 synchronized 關鍵字進行同步,而 StringBuilder 沒有。
綜上所述,String 是不可變的主要基於安全性、線程安全性和性能等考慮。
9)拆箱:將包裝類型轉換為基本數據類型; int 和 Integer 有什麼區別?
在 Java 中,int 是基本數據類型,而 Integer 是 int 的包裝類型。它們之間的區別主要有以下幾點:
- 數據類型: int 是 Java 的基本數據類型,而 Integer 是 int 的包裝類,是一個對象。
- 默認值: int 的默認值是 0,而 Integer 的默認值是 null(如果未初始化)。
- 對象和性能: Integer 是一個對象,拆箱操作將 Integer 對象轉換為 int 值,這可能會帶來性能損失。而直接使用 int 不涉及對象操作,性能更高。
- 使用場景: 一般情況下,如果只需要操作數值,可以直接使用 int,而如果需要在集合類中操作數值或者需要將數值作為對象處理(比如作為方法參數),則可以使用 Integer。
10)Integer a = 127 和 Integer b = 127 相等嗎?
在 Java 中,對於 Integer 類型的對象,如果值在 -128 到 127 之間,會被 JVM 緩存起來,因此相同數值的 Integer 對象引用會指向相同的對象。因此,Integer a = 127 和 Integer b = 127 是相等的,它們引用的是同一個對象。
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // 輸出 true
但是需要注意,如果超出了緩存範圍,比如 Integer a = 128 和 Integer b = 128,則會創建新的對象,它們引用的不是同一個對象。
Integer a = 128;
Integer b = 128;
System.out.println(a == b); // 輸出 false