1. 8 種基本數據類型
- 整數類型
- byte:
它是最小的整數類型,占用 1 個字節(8 位)。在一些對內存使用要求極高的場景,比如嵌入式系統開發、數據傳輸時對數據量有嚴格限制的情況,會使用byte
類型。例如,在處理圖像數據中的像素值時,如果每個像素值范圍在 -128 到 127 之間,就可以用byte
存儲。 - short:
占用 2 個字節(16 位)。在一些特定的圖形處理庫中,可能會使用short
來表示一些相對較小的坐標值或顏色分量值,因為它比int
更節省內存。 - int:
這是 Java 中最常用的整數類型,占用 4 個字節(32 位)。在日常的編程中,如計數、索引、循環控制等場景,通常都會使用int
類型。例如,遍歷數組、計算循環次數等。 - long:
占用 8 個字節(64 位)。當需要處理非常大的整數時,如計算時間戳(以毫秒為單位)、處理大數據量的統計結果等,就需要使用long
類型。定義時,需要在數字后面加上L
或l
,建議使用大寫的L
,因為小寫的l
容易與數字 1 混淆。
- byte:
- 浮點類型
- float:
單精度浮點數,占用 4 個字節(32 位)。在一些對精度要求不高的科學計算、圖形處理中的一些近似計算等場景中使用。例如,在游戲開發中,計算物體的位置、速度等,可能只需要一定的精度,此時可以使用float
類型。定義時需要在數字后面加上F
或f
。 - double:
雙精度浮點數,占用 8 個字節(64 位)。是 Java 中默認的浮點類型,精度比float
高。在大多數需要處理小數的場景中,如金融計算、科學研究等,都會使用double
類型。
- float:
- 字符類型
- char:
占用 2 個字節(16 位),基于 Unicode 字符集,可以表示世界上大多數語言的字符。在處理文本、字符串操作時,char
類型非常有用。例如,遍歷字符串中的每個字符時,就會用到char
類型。
- char:
- 布爾類型
- boolean:
只有兩個值,true
和false
,用于邏輯判斷。在條件語句(如if
、while
等)、邏輯運算中廣泛使用。
- boolean:
2. 什么是裝箱和拆箱
- 裝箱
- 自動裝箱:Java 編譯器會自動將基本數據類型轉換為對應的包裝類對象。例如:
java
int num = 10;
Integer integerObj = num; // 自動裝箱
????????????????? 2. 手動裝箱:在 Java 9 及以前,可以使用包裝類的構造方法進行裝箱;Java 9 及以后,部分構造方法已被棄用,建議使用 valueOf
方法。例如:
java
int num = 10;
// Java 9 以前
// Integer integerObj2 = new Integer(num);
// Java 9 及以后
Integer integerObj2 = Integer.valueOf(num);
使用 valueOf
方法的好處是,它會緩存一些常用的值,提高性能。例如,Integer
類會緩存 -128 到 127 之間的整數對象,當使用 valueOf
方法創建這個范圍內的對象時,會直接返回緩存的對象,而不是創建新的對象。
- 拆箱
- 自動拆箱:Java 編譯器會自動將包裝類對象轉換為對應的基本數據類型。例如:
java
Integer integer = 20;
int num2 = integer; // 自動拆箱
??????????????????? 2. 手動拆箱:調用包裝類的 xxxValue()
方法進行拆箱。例如:
java
Integer integer = 20;
int num3 = integer.intValue(); // 手動拆箱
3. String 轉出 int 型,判斷能不能轉?如何轉?
- 判斷能否轉換的更多方法
- 正則表達式:可以使用正則表達式判斷字符串是否只包含數字字符。例如:
java
import java.util.regex.Pattern;public class StringToInt {public static boolean isNumeric(String str) {Pattern pattern = Pattern.compile("^-?\\d+$");return pattern.matcher(str).matches();}public static void main(String[] args) {String str = "123";if (isNumeric(str)) {try {int num = Integer.parseInt(str);System.out.println(num);} catch (NumberFormatException e) {System.out.println("字符串不能轉換為整數");}} else {System.out.println("字符串不是有效的數字");}}
}
?????? 2. 嘗試轉換并捕獲異常:直接嘗試使用 Integer.parseInt()
或 Integer.valueOf()
方法進行轉換,并捕獲 NumberFormatException
異常。例如:
java
public class StringToInt2 {public static void main(String[] args) {String str = "abc";try {int num = Integer.parseInt(str);System.out.println(num);} catch (NumberFormatException e) {System.out.println("字符串不能轉換為整數");}}
}
- 轉換方法的性能分析
Integer.parseInt()
方法直接返回基本數據類型int
,效率相對較高,適用于需要直接使用int
類型的場景。Integer.valueOf()
方法返回的是Integer
對象,在需要基本數據類型時會自動拆箱。如果需要使用Integer
對象,或者在泛型、集合等場景中使用,建議使用Integer.valueOf()
方法。
4. short s1 = 1; s1 = s1 + 1; 有什么錯?short s1 = 1; s1 +=1; 有什么錯?
short s1 = 1; s1 = s1 + 1;
在 Java 中,當進行算術運算時,short
、byte
和char
類型會自動提升為int
類型。所以s1 + 1
的結果是int
類型。而s1
是short
類型,將int
類型的值賦給short
類型的變量需要進行強制類型轉換,否則會導致編譯錯誤。正確的寫法是:
java
short s1 = 1;
s1 = (short) (s1 + 1);
short s1 = 1; s1 +=1;
+=
是復合賦值運算符,它會自動進行類型轉換。s1 += 1
實際上等價于s1 = (short)(s1 + 1)
,所以不會有編譯錯誤。
5. Int 與 Integer 區別
- 內存使用差異
int
類型變量直接存儲值,存儲在棧內存中,占用的內存空間是固定的,根據類型不同而不同(如int
占用 4 個字節)。Integer
是引用類型,變量存儲的是對象的引用,對象本身存儲在堆內存中,引用存儲在棧內存中。除了對象本身占用的內存外,還需要額外的內存來存儲引用。
- 性能差異
- 在進行大量的數值計算時,
int
類型的性能要高于Integer
類型。因為int
類型不需要進行裝箱和拆箱操作,而Integer
類型在進行計算時需要進行裝箱和拆箱,會帶來一定的性能開銷。
6. 字節字符區別
- 編碼與解碼
- 字節:字節是計算機存儲和傳輸數據的基本單位,在不同的編碼格式下,字節與字符的對應關系不同。例如,在 ASCII 編碼中,一個字節對應一個字符;在 UTF - 8 編碼中,一個字符可能由 1 到 4 個字節表示。
- 字符:字符是人類能夠識別的符號,在 Java 中,
char
類型基于 Unicode 字符集。在進行文件讀寫、網絡傳輸等操作時,需要進行字符編碼和解碼。例如,將字符串轉換為字節數組時,需要指定編碼格式:
java
String str = "你好";
try {byte[] bytes = str.getBytes("UTF-8");
} catch (Exception e) {e.printStackTrace();
}
- 處理場景
- 字節處理:在處理二進制文件(如圖片、視頻、音頻等)時,主要使用字節進行操作。例如,使用
FileInputStream
和FileOutputStream
進行文件讀寫時,讀取和寫入的都是字節數據。 - 字符處理:在處理文本文件(如
.txt
文件)、進行字符串操作時,主要使用字符進行操作。例如,使用FileReader
和FileWriter
進行文件讀寫時,讀取和寫入的都是字符數據。
7. 基本類型與引用類型的區別
- 垃圾回收
- 基本類型:基本類型變量存儲在棧內存中,當變量的作用域結束時,棧內存中的空間會自動釋放,不需要垃圾回收機制進行處理。
- 引用類型:引用類型對象存儲在堆內存中,當對象不再被引用時,會被垃圾回收機制標記為可回收對象,在合適的時機進行回收。
- 數組與基本類型、引用類型的關系
- 基本類型數組:數組中的每個元素都是基本類型,數組本身是引用類型,存儲在堆內存中,而數組元素存儲在數組所占用的內存空間中。例如:
java
int[] arr = new int[10];
???? 2. 引用類型數組:數組中的每個元素都是引用類型,數組本身和數組元素都存儲在堆內存中。例如:
java
String[] strArr = new String[10];
8. 重寫重載封裝繼承多態
- 重寫的注意事項
- 異常處理:子類重寫的方法不能拋出比父類被重寫方法更多、更寬泛的異常。例如,如果父類方法拋出
IOException
,子類重寫的方法可以拋出IOException
或其子類異常,或者不拋出異常。 - 方法簽名嚴格匹配:方法名、參數列表和返回值類型必須與父類被重寫的方法相同(子類返回值類型可以是父類返回值類型的子類,這稱為協變返回類型)。
- 重載的實現原理
重載方法是根據方法的參數列表(參數個數、類型或順序)來區分的。在編譯時,編譯器會根據調用方法時傳遞的參數類型和數量,選擇合適的重載方法進行調用。
- 封裝的優勢
- 提高安全性:通過將數據和操作數據的方法封裝在一起,使用
private
訪問修飾符隱藏對象的內部實現細節,只對外提供必要的接口,可以防止外部代碼直接訪問和修改對象的內部數據,從而提高代碼的安全性。 - 提高可維護性:當需要修改對象的內部實現時,只需要修改封裝類的內部代碼,而不會影響到外部調用代碼,降低了代碼的耦合度,提高了代碼的可維護性。
- 繼承的限制和拓展
- 單繼承限制:Java 只支持單繼承,即一個子類只能有一個直接父類。但可以通過實現多個接口來實現類似多繼承的功能。
- 方法重寫和調用父類方法:子類可以重寫父類的方法來實現自己的功能,同時可以使用
super
關鍵字調用父類的方法。例如:
java
class Parent {public void print() {System.out.println("Parent");}
}class Child extends Parent {@Overridepublic void print() {super.print();System.out.println("Child");}
}
- 多態的實現方式和應用場景
- 實現方式:多態的實現方式有繼承和接口。通過父類引用指向子類對象,在運行時根據實際對象類型調用相應的方法。例如:
java
class Animal {public void sound() {System.out.println("Animal makes a sound");}
}class Dog extends Animal {@Overridepublic void sound() {System.out.println("Dog barks");}
}public class Main {public static void main(String[] args) {Animal animal = new Dog();animal.sound();}
}
?????? 2.應用場景:多態在代碼的可擴展性和可維護性方面有很大的優勢。例如,在游戲開發中,不同的角色可能有不同的攻擊方式,可以通過多態來實現統一的攻擊接口,根據實際角色類型調用相應的攻擊方法。
9.是否可以覆蓋 (override) 一個 private 或者是 static 的方法?
- private 方法
private
方法的作用域僅限于當前類,子類無法訪問父類的private
方法。所以子類中定義的與父類private
方法同名的方法,只是一個新的方法,與父類的方法沒有關系。例如:
java
class Parent {private void privateMethod() {System.out.println("Parent private method");}
}class Child extends Parent {public void privateMethod() {System.out.println("Child private method");}
}
在這個例子中,Child
類中的 privateMethod
方法與 Parent
類中的 privateMethod
方法沒有重寫關系。
- static 方法
靜態方法屬于類,而不是對象。子類可以定義與父類靜態方法同名的靜態方法,這稱為方法隱藏。調用時,根據引用類型決定調用哪個方法,而不是根據實際對象類型。例如:
java
class Parent {public static void staticMethod() {System.out.println("Parent static method");}
}class Child extends Parent {public static void staticMethod() {System.out.println("Child static method");}
}public class Main {public static void main(String[] args) {Parent parent = new Child();parent.staticMethod(); // 調用 Parent 類的 staticMethod 方法}
}
10. 什么是 PriorityQueue
- 實現原理
PriorityQueue
基于優先級堆實現,優先級堆是一種完全二叉樹,它的每個節點的值都大于或等于其子節點的值(最大堆),或者小于或等于其子節點的值(最小堆)。在 PriorityQueue
中,默認是最小堆。插入和刪除元素的時間復雜度為 O (log n),獲取隊首元素的時間復雜度為 O (1)。
- 自定義比較器
可以通過提供自定義的 Comparator
來指定元素的排序規則。例如,要創建一個最大堆的 PriorityQueue
:
java
import java.util.PriorityQueue;
import java.util.Comparator;public class PriorityQueueExample {public static void main(String[] args) {PriorityQueue<Integer> pq = new PriorityQueue<>(Comparator.reverseOrder());pq.add(3);pq.add(1);pq.add(2);while (!pq.isEmpty()) {System.out.println(pq.poll());}}
}
- 應用場景拓展
- 任務調度:在操作系統中,任務調度器可以使用
PriorityQueue
來管理任務,根據任務的優先級來決定任務的執行順序。 - Dijkstra 算法:在圖算法中,Dijkstra 算法可以使用
PriorityQueue
來優化,提高算法的效率。
?友情提示:本文已經整理成文檔,可以到如下鏈接免積分下載閱讀
?https://download.csdn.net/download/ylfhpy/90493708