Java面試黃金寶典1

1. 8 種基本數據類型

  • 整數類型
    1. byte
      它是最小的整數類型,占用 1 個字節(8 位)。在一些對內存使用要求極高的場景,比如嵌入式系統開發、數據傳輸時對數據量有嚴格限制的情況,會使用 byte 類型。例如,在處理圖像數據中的像素值時,如果每個像素值范圍在 -128 到 127 之間,就可以用 byte 存儲。
    2. short
      占用 2 個字節(16 位)。在一些特定的圖形處理庫中,可能會使用 short 來表示一些相對較小的坐標值或顏色分量值,因為它比 int 更節省內存。
    3. int
      這是 Java 中最常用的整數類型,占用 4 個字節(32 位)。在日常的編程中,如計數、索引、循環控制等場景,通常都會使用 int 類型。例如,遍歷數組、計算循環次數等。
    4. long
      占用 8 個字節(64 位)。當需要處理非常大的整數時,如計算時間戳(以毫秒為單位)、處理大數據量的統計結果等,就需要使用 long 類型。定義時,需要在數字后面加上 Ll,建議使用大寫的 L,因為小寫的 l 容易與數字 1 混淆。
  • 浮點類型
    1. float
      單精度浮點數,占用 4 個字節(32 位)。在一些對精度要求不高的科學計算、圖形處理中的一些近似計算等場景中使用。例如,在游戲開發中,計算物體的位置、速度等,可能只需要一定的精度,此時可以使用 float 類型。定義時需要在數字后面加上 Ff
    2. double
      雙精度浮點數,占用 8 個字節(64 位)。是 Java 中默認的浮點類型,精度比 float 高。在大多數需要處理小數的場景中,如金融計算、科學研究等,都會使用 double 類型。
  • 字符類型
    1. char
      占用 2 個字節(16 位),基于 Unicode 字符集,可以表示世界上大多數語言的字符。在處理文本、字符串操作時,char 類型非常有用。例如,遍歷字符串中的每個字符時,就會用到 char 類型。
  • 布爾類型
    1. boolean
      只有兩個值,truefalse,用于邏輯判斷。在條件語句(如 ifwhile 等)、邏輯運算中廣泛使用。

2. 什么是裝箱和拆箱

  • 裝箱
    1. 自動裝箱: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 方法創建這個范圍內的對象時,會直接返回緩存的對象,而不是創建新的對象。

  • 拆箱
    1. 自動拆箱:Java 編譯器會自動將包裝類對象轉換為對應的基本數據類型。例如:

java

Integer integer = 20;
int num2 = integer; // 自動拆箱

??????????????????? 2. 手動拆箱:調用包裝類的 xxxValue() 方法進行拆箱。例如:

java

Integer integer = 20;
int num3 = integer.intValue(); // 手動拆箱

3. String 轉出 int 型,判斷能不能轉?如何轉?

  • 判斷能否轉換的更多方法

  1. 正則表達式:可以使用正則表達式判斷字符串是否只包含數字字符。例如:

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("字符串不能轉換為整數");}}
}

  • 轉換方法的性能分析

  1. Integer.parseInt() 方法直接返回基本數據類型 int,效率相對較高,適用于需要直接使用 int 類型的場景。
  2. 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 中,當進行算術運算時,shortbytechar 類型會自動提升為 int 類型。所以 s1 + 1 的結果是 int 類型。而 s1short 類型,將 int 類型的值賦給 short 類型的變量需要進行強制類型轉換,否則會導致編譯錯誤。正確的寫法是:

java

short s1 = 1;
s1 = (short) (s1 + 1);

  • short s1 = 1; s1 +=1;
    += 是復合賦值運算符,它會自動進行類型轉換。s1 += 1 實際上等價于 s1 = (short)(s1 + 1),所以不會有編譯錯誤。

5. Int 與 Integer 區別

  • 內存使用差異

  1. int 類型變量直接存儲值,存儲在棧內存中,占用的內存空間是固定的,根據類型不同而不同(如 int 占用 4 個字節)。
  2. Integer 是引用類型,變量存儲的是對象的引用,對象本身存儲在堆內存中,引用存儲在棧內存中。除了對象本身占用的內存外,還需要額外的內存來存儲引用。

  • 性能差異

  1. 在進行大量的數值計算時,int 類型的性能要高于 Integer 類型。因為 int 類型不需要進行裝箱和拆箱操作,而 Integer 類型在進行計算時需要進行裝箱和拆箱,會帶來一定的性能開銷。

6. 字節字符區別

  • 編碼與解碼

  1. 字節:字節是計算機存儲和傳輸數據的基本單位,在不同的編碼格式下,字節與字符的對應關系不同。例如,在 ASCII 編碼中,一個字節對應一個字符;在 UTF - 8 編碼中,一個字符可能由 1 到 4 個字節表示。
  2. 字符:字符是人類能夠識別的符號,在 Java 中,char 類型基于 Unicode 字符集。在進行文件讀寫、網絡傳輸等操作時,需要進行字符編碼和解碼。例如,將字符串轉換為字節數組時,需要指定編碼格式:

java

String str = "你好";
try {byte[] bytes = str.getBytes("UTF-8");
} catch (Exception e) {e.printStackTrace();
}

  • 處理場景

  1. 字節處理:在處理二進制文件(如圖片、視頻、音頻等)時,主要使用字節進行操作。例如,使用 FileInputStreamFileOutputStream 進行文件讀寫時,讀取和寫入的都是字節數據。
  2. 字符處理:在處理文本文件(如 .txt 文件)、進行字符串操作時,主要使用字符進行操作。例如,使用 FileReaderFileWriter 進行文件讀寫時,讀取和寫入的都是字符數據。

7. 基本類型與引用類型的區別

  • 垃圾回收

  1. 基本類型:基本類型變量存儲在棧內存中,當變量的作用域結束時,棧內存中的空間會自動釋放,不需要垃圾回收機制進行處理。
  2. 引用類型:引用類型對象存儲在堆內存中,當對象不再被引用時,會被垃圾回收機制標記為可回收對象,在合適的時機進行回收。

  • 數組與基本類型、引用類型的關系

  1. 基本類型數組:數組中的每個元素都是基本類型,數組本身是引用類型,存儲在堆內存中,而數組元素存儲在數組所占用的內存空間中。例如:

java

int[] arr = new int[10];

???? 2. 引用類型數組:數組中的每個元素都是引用類型,數組本身和數組元素都存儲在堆內存中。例如:

java

String[] strArr = new String[10];

8. 重寫重載封裝繼承多態

  • 重寫的注意事項

  1. 異常處理:子類重寫的方法不能拋出比父類被重寫方法更多、更寬泛的異常。例如,如果父類方法拋出 IOException,子類重寫的方法可以拋出 IOException 或其子類異常,或者不拋出異常。
  2. 方法簽名嚴格匹配:方法名、參數列表和返回值類型必須與父類被重寫的方法相同(子類返回值類型可以是父類返回值類型的子類,這稱為協變返回類型)。

  • 重載的實現原理

重載方法是根據方法的參數列表(參數個數、類型或順序)來區分的。在編譯時,編譯器會根據調用方法時傳遞的參數類型和數量,選擇合適的重載方法進行調用。

  • 封裝的優勢

  1. 提高安全性:通過將數據和操作數據的方法封裝在一起,使用 private 訪問修飾符隱藏對象的內部實現細節,只對外提供必要的接口,可以防止外部代碼直接訪問和修改對象的內部數據,從而提高代碼的安全性。
  2. 提高可維護性:當需要修改對象的內部實現時,只需要修改封裝類的內部代碼,而不會影響到外部調用代碼,降低了代碼的耦合度,提高了代碼的可維護性。

  • 繼承的限制和拓展

  1. 單繼承限制:Java 只支持單繼承,即一個子類只能有一個直接父類。但可以通過實現多個接口來實現類似多繼承的功能。
  2. 方法重寫和調用父類方法:子類可以重寫父類的方法來實現自己的功能,同時可以使用 super 關鍵字調用父類的方法。例如:

java

class Parent {public void print() {System.out.println("Parent");}
}class Child extends Parent {@Overridepublic void print() {super.print();System.out.println("Child");}
}

  • 多態的實現方式和應用場景

  1. 實現方式:多態的實現方式有繼承和接口。通過父類引用指向子類對象,在運行時根據實際對象類型調用相應的方法。例如:

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());}}
}

  • 應用場景拓展

  1. 任務調度:在操作系統中,任務調度器可以使用 PriorityQueue 來管理任務,根據任務的優先級來決定任務的執行順序。
  2. Dijkstra 算法:在圖算法中,Dijkstra 算法可以使用 PriorityQueue 來優化,提高算法的效率。

?友情提示:本文已經整理成文檔,可以到如下鏈接免積分下載閱讀

?https://download.csdn.net/download/ylfhpy/90493708

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/72687.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72687.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72687.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OSGEarth

OSGEarth 基于 OpenSceneGraph 構建的一個擴展庫&#xff0c;專門用于地球科學和地理信息系統&#xff08;GIS&#xff09;數據的可視化。它允許開發者創建逼真的三維地球模型&#xff0c;并在其上展示各種地理空間數據。 高端一點的表述 基于三維引擎osg開發的三維數字地球…

Word 小黑第34套

對應大貓34 設置第二頁水印&#xff0c;取消第一頁的&#xff1a;取消第二頁頁眉鏈接&#xff0c;刪除第一張水印圖片&#xff08;delete&#xff09; 調整水印圖片&#xff1a;點開頁眉頁腳 雙擊圖片 可以調整 郵件合并 -創建標簽 橫標簽數3 豎標簽5 表布局 -查看網格線 插…

2.5.1 io_uring

文章目錄 2.5.1 io_uring1. 對比1. select、poll、epoll 對比表格2. 關鍵特性說明&#xff1a;3. 應用場景 2. 異步io1. 頻繁copy2. 如何做到線程安全 3. io_uring1. 實現2. 關鍵點&#xff1a;3. 問題1. Reactor 與 Proactor 的三點不同2. epoll 與 io_uring 的區別 2.5.1 io_…

K8S學習之基礎三十六:node-exporter部署

Prometheus v2.2.1 ? 編寫yaml文件&#xff0c;包含創建ns、configmap、deployment、service # 創建monitoring空間 vi prometheus-ns.yaml apiVersion: v1 kind: Namespace metadata:name: monitoring# 創建SA并綁定權限 kubectl create serviceaccount monitor -n monito…

為什么“連接斷開可能導致鎖未釋放”

目錄 兩種典型場景可能導致鎖未及時釋放1. **數據庫未及時檢測到連接斷開**2. **應用程序未正確處理事務** 為什么說“可能因連接斷開導致死鎖”&#xff1f;如何避免此類問題&#xff1f;總結 在大多數數據庫實現中&#xff0c;如果持有鎖的連接&#xff08;或會話&#xff09…

【實戰指南】基于DevExpress輕量化主題實現WPF應用性能升級

DevExpress WPF擁有120個控件和庫&#xff0c;將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序&#xff0c;這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

【C++多線程】C++異步線程池提交任務的寫法和解釋

// 提交任務到線程池 template<class F, class... Args> auto ThreadPool::enqueue(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type> {using return_type typename std::result_of<F(Args...)>…

CSS 屬性選擇器詳解

CSS 屬性選擇器詳解 引言 CSS(層疊樣式表)是網頁設計中的重要組成部分,它用于控制網頁元素的樣式和布局。屬性選擇器是CSS選擇器的一種,它允許開發者根據元素的特定屬性來選擇和樣式化元素。本文將詳細講解CSS屬性選擇器的概念、語法以及常用屬性選擇器的使用方法。 一、…

二維前綴矩陣

1.大衣的旅行 #include<bits/stdc.h> #define int long long using namespace std; int t; int n,m,k; bool check(int mid,vector<vector<int>>pre,vector<vector<int>>a) {for(int i1; i<n; i){for(int j1; j<m; j){//枚舉以老師房間為…

python-leetcode 56.電話號碼的字母組合

題目&#xff1a; 給定一個僅包含數字的2-9的字符串&#xff0c;返回所有它可能表示的字母組合&#xff0c;答案可以按任意順序返回 給出數字到字母的映射如下&#xff08;與電話按鍵相同&#xff09;&#xff0c;注意1不對應任何字母 方法一&#xff1a;深度優先搜索&#x…

keepalived應用

Keepalived 是一個基于 VRRP&#xff08;虛擬路由冗余協議&#xff09;實現的高可用解決方案&#xff0c;常用于構建高可用性的服務器集群&#xff0c;特別是在負載均衡場景中&#xff0c;可確保服務的不間斷運行。以下為你詳細介紹它&#xff1a; 0主要功能 高可用性&#x…

5.0 VisionPro調用USB相機的方法與步驟說明(一)

本文介紹如何在C#中調用visionPro以處理USB相機采集到的圖片。示例如下: 主要思路如下: 1. 使用AForge來打開以及采集usb相機照片。 usb相機處于一直運行狀態。每隔100ms采集一次照片。且觸發一次事件。 public void Start() { this.videoSourcePlayer.Stop(); …

論文閱讀:Deep Hybrid Camera Deblurring for Smartphone Cameras

今天介紹一篇 ACM SIGGRAPH 2024 的文章&#xff0c;關于手機影像中的去模糊的文章。 Deep Hybrid Camera Deblurring for Smartphone Cameras Abstract 手機攝像頭盡管取得了顯著的進步&#xff0c;但由于傳感器和鏡頭較為緊湊&#xff0c;在低光環境下的成像仍存在困難&am…

Linux中的基本指令(下)

目錄 mv指令 more指令 less指令 head指令 tail 指令 繼續理解文件 重定向和追加重定向操作 理解管道 find指令 whereis 指令 bc指令 uname ?r指令 grep 指令 關機 擴展命令 zip/unzip 指令 tar指令 關于rzsz 系統間的文件互傳 接上&#xff01; mv指令 m…

Unity大型游戲開發全流程指南

一、開發流程與核心步驟 1. 項目規劃與設計階段 需求分析 明確游戲類型&#xff08;MMORPG/開放世界/競技等&#xff09;、核心玩法&#xff08;戰斗/建造/社交&#xff09;、目標平臺&#xff08;PC/移動/主機&#xff09;示例&#xff1a;MMORPG需規劃角色成長樹、副本Boss…

Unity WebGL IIS報錯無法使用

Unity WebGL IIS報錯無法使用 原因1&#xff1a;WebGL文件夾無訪問權限 右鍵WebGL文件夾-屬性 點擊安全-編輯-添加 輸入ever點擊確定-應用即可

【JDK17】開源應用服務器大比對

接著 next-public 源代碼分析&#xff0c;Java 應用服務器選用 jetty。但是之前普遍使用 Tomcat&#xff0c;那為什么要用 jetty 么&#xff0c;除了這兩個&#xff0c;Java 應用服務器開源現狀并不了解&#xff0c;故而又是一篇科普性的筆記&#xff0c;以下是 又小又快的 Jav…

docker-compose install nginx(解決fastgpt跨區域)

CORS前言 CORS(Cross-Origin Resource Sharing,跨源資源共享)是一種安全措施,它允許或拒絕來自不同源(協議、域名、端口任一不同即為不同源)的網頁訪問另一源中的資源。它的主要作用如下: 同源策略限制:Web 瀏覽器的同源策略限制了從一個源加載的文檔或腳本如何與另一…

算法刷題記錄——LeetCode篇(4) [第301~400題](持續更新)

(優先整理熱門100及面試150&#xff0c;不定期持續更新&#xff0c;歡迎關注) 322. 零錢兌換 給你一個整數數組 coins &#xff0c;表示不同面額的硬幣&#xff1b;以及一個整數 amount &#xff0c;表示總金額。 計算并返回可以湊成總金額所需的最少的硬幣個數。如果沒有任何…

vulnhub靶場之loly靶機

前言 挑戰攻克該靶機30分鐘 靶機&#xff1a;loly靶機&#xff0c;IP地址為192.168.10.11 攻擊&#xff1a;kali&#xff0c;IP地址為192.168.10.6 靶機和攻擊機都采用VMware虛擬機&#xff0c;都采用橋接網卡模式 文章涉及的靶機及工具&#xff0c;都可以自行訪問官網或者項…