久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 學習資源 > 講師博文 > Java 最常見面試題

Java 最常見面試題 時間:2024-05-06      來源:華清遠見

1. JDK 和 JRE 有什么區別?

 JDK:Java Development Kit 的簡稱,Java 開發工具包,提供了 Java 的開發環境和運行環境。

 JRE:Java Runtime Environment 的簡稱,Java 運行環境,為 Java 的運行提供了所需環境。

 具體來說 JDK 其實包含了 JRE,同時還包含了編譯 Java 源碼的編譯器 Javac,還包含了很多 Java 程序調試和分析的工具。簡單來說:如果你需要運行 Java 程序,只需安裝 JRE 就可以了,如果你需要編寫 Java 程序,需要安裝 JDK。

2. == 和 equals 的區別是什么?

== 解讀

對于基本類型和引用類型 == 的作用效果是不同的,如下所示:

基本類型:比較的是值是否相同;

引用類型:比較的是引用是否相同;

代碼示例:

String x = "string";

String y = "string";

String z = new String("string");

System.out.println(x==y); // true

System.out.println(x==z); // false

System.out.println(x.equals(y)); // true

System.out.println(x.equals(z)); // true

 代碼解讀:因為 x 和 y 指向的是同一個引用,所以 == 也是 true,而 new String()方法則重寫開辟了內存空間,所以 == 結果為 false,而 equals 比較的一直是值,所以結果都為 true。

equals 解讀

 equals 本質上就是 ==,只不過 String 和 Integer 等重寫了 equals 方法,把它變成了值比較。看下面的代碼就明白了。

首先來看默認情況下 equals 比較一個有相同值的對象,代碼如下:

 

class Cat {

public Cat(String name) {

this.name = name;

}

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

Cat c1 = new Cat("王磊");

Cat c2 = new Cat("王磊");

System.out.println(c1.equals(c2)); // false

 輸出結果出乎我們的意料,竟然是 false?這是怎么回事,看了 equals 源碼就知道了,源碼如下:

public boolean equals(Object obj) {

return (this == obj);

}

原來 equals 本質上就是 ==。

那問題來了,兩個相同值的 String 對象,為什么返回的是 true?代碼如下:

String s1 = new String("老王");

String s2 = new String("老王");

System.out.println(s1.equals(s2)); // true

同樣的,當我們進入 String 的 equals 方法,找到了答案,代碼如下:

public boolean equals(Object anObject) {

if (this == anObject) {

return true;

}

if (anObject instanceof String) {

String anotherString = (String)anObject;

int n = value.length;

if (n == anotherString.value.length) {

char v1[] = value;

char v2[] = anotherString.value;

int i = 0;

while (n-- != 0) {

if (v1[i] != v2[i])

return false;

i++;

}

return true;

}

}

return false;

}

原來是 String 重寫了 Object 的 equals 方法,把引用比較改成了值比較。

總結 :== 對于基本類型來說是值比較,對于引用類型來說是比較的是引用;而 equals 默認情況下是引用比較,只是很多類重新了 equals 方法,比如 String、Integer 等把它變成了值比較,所以一般情況下 equals 比較的是值是否相等。

3. 兩個對象的 hashCode() 相同,則 equals() 也一定為 true,對嗎?

不對,兩個對象的 hashCode() 相同,equals() 不一定 true。

代碼示例:

String str1 = "通話";

String str2 = "重地";

 System. out. println(String. format("str1:%d | str2:%d", str1. hashCode(),str2. hashCode()));

System. out. println(str1. equals(str2));

執行的結果: 

str1:1179395 | str2:1179395

false

 代碼解讀:很顯然“通話”和“重地”的 hashCode() 相同,然而 equals() 則為 false,因為在散列表中,hashCode() 相等即兩個鍵值對的哈希值相等,然而哈希值相等,并不一定能得出鍵值對相等。

4. 接口和抽象類有什么區別?

 實現:抽象類的子類使用 extends 來繼承;接口必須使用 implements 來實現接口。

構造函數:抽象類可以有構造函數;接口不能有。

實現數量:類可以實現很多個接口;但是只能繼承一個抽象類。

訪問修飾符:接口中的方法默認使用 public 修飾;抽象類中的方法可以是任意訪問修飾符。

5 Collection 和 Collections 有什么區別?

 Collection 是一個集合接口,它提供了對集合對象進行基本操作的通用接口方法,所有集合都是它的子類,比如 List、Set 等。

 Collections 是一個包裝類,包含了很多靜態方法,不能被實例化,就像一個工具類,比如提供的排序方法: Collections. sort(list)。

6. HashMap 和 Hashtable 有什么區別?

 存儲:HashMap 運行 key 和 value 為 null,而 Hashtable 不允許。

線程安全:Hashtable 是線程安全的,而 HashMap 是非線程安全的。

 推薦使用:在 Hashtable 的類注釋可以看到,Hashtable 是保留類不建議使用,推薦在單線程環境下使用 HashMap 替代,如果需要多線程使用則用 ConcurrentHashMap 替代。

 HashSet 是基于 HashMap 實現的,HashSet 底層使用 HashMap 來保存所有元素,因此 HashSet 的實現比較簡單,相關 HashSet 的操作,基本上都是直接調用底層 HashMap 的相關方法來完成,HashSet 不允許重復的值。

7. ArrayList 和 LinkedList 的區別是什么?

 數據結構實現:ArrayList 是動態數組的數據結構實現,而 LinkedList 是雙向鏈表的數據結構實現。

 隨機訪問效率:ArrayList 比 LinkedList 在隨機訪問的時候效率要高,因為 LinkedList 是線性的數據存儲方式,所以需要移動指針從前往后依次查找。

 增加和刪除效率:在非首尾的增加和刪除操作,LinkedList 要比 ArrayList 效率要高,因為 ArrayList 增刪操作要影響數組內的其他數據的下標。

 綜合來說,在需要頻繁讀取集合中的元素時,更推薦使用 ArrayList,而在插入和刪除操作較多時,更推薦使用 LinkedList。

8. 迭代器 Iterator 是什么?

 Iterator 接口提供遍歷任何 Collection 的接口。我們可以從一個 Collection 中使用迭代器方法來獲取迭代器實例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器允許調用者在迭代過程中移除元素。

);

9. 并行和并發有什么區別?

并行:多個處理器或多核處理器同時處理多個任務。

 并發:多個任務在同一個 CPU 核上,按細分的時間片輪流(交替)執行,從邏輯上來看那些任務是同時執行。

如下圖:

并發 = 兩個隊列和一臺咖啡機。

并行 = 兩個隊列和兩臺咖啡機。

實現 Callable 接口。

10. sleep() 和 wait() 有什么區別?

類的不同:sleep() 來自 Thread,wait() 來自 Object。

釋放鎖:sleep() 不釋放鎖;wait() 釋放鎖。

 用法不同:sleep() 時間到會自動恢復;wait() 可以使用 notify()/notifyAll()直接喚醒。

11. notify()和 notifyAll()有什么區別?

 notifyAll()會喚醒所有的線程,notify()之后喚醒一個線程。notifyAll() 調用后,會將全部線程由等待池移到鎖池,然后參與鎖的競爭,競爭成功則繼續執行,如果不成功則留在鎖池等待鎖被釋放后再次參與競爭。而 notify()只會喚醒一個線程,具體喚醒哪一個線程由虛擬機控制。

12. 線程的 run() 和 start() 有什么區別?

 start() 方法用于啟動線程,run() 方法用于執行線程的運行時代碼。run() 可以重復調用,而 start() 只能調用一次。

池創建,上面1-3創建方式都是對ThreadPoolExecutor的封裝。

13. 在 Java 程序中怎么保證多線程的運行安全?

方法一:使用安全類,比如 Java. util. concurrent 下的類。

方法二:使用自動鎖 synchronized。

方法三:使用手動鎖 Lock。

手動鎖 Java 示例代碼如下:

Lock lock = new ReentrantLock();

lock. lock();

try {

System. out. println("獲得鎖");

} catch (Exception e) {

// TODO: handle exception

} finally {

System. out. println("釋放鎖");

lock. unlock();

}

14. 什么是死鎖?

 當線程 A 持有獨占鎖a,并嘗試去獲取獨占鎖 b 的同時,線程 B 持有獨占鎖 b,并嘗試獲取獨占鎖 a 的情況下,就會發生 AB 兩個線程由于互相持有對方需要的鎖,而發生的阻塞現象,我們稱為死鎖。

15. 怎么防止死鎖?

 盡量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),設置超時時間,超時可以退出防止死鎖。

盡量使用 Java. util. concurrent 并發類代替自己手寫鎖。

盡量降低鎖的使用粒度,盡量不要幾個功能用同一把鎖。

盡量減少同步的代碼塊。

16. 什么是 Java 序列化?什么情況下需要序列化?

Java 序列化是為了保存各種對象在內存中的狀態,并且可以把保存的對象狀態再讀出來。

以下情況需要使用 Java 序列化:

想把的內存中的對象狀態保存到一個文件中或者數據庫中時候;

想用套接字在網絡上傳送對象的時候;

想通過RMI(遠程方法調用)傳輸對象的時候。

page:代表與一個頁面相關的對象和屬性。

 request:代表與客戶端發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個 Web 組件;需要在頁面顯示的臨時數據可以置于此作用域。

 session:代表與某個用戶與服務器建立的一次會話相關的對象和屬性。跟某個用戶相關的數據應該放在用戶自己的 session 中。

 application:代表與整個 Web 應用程序相關的對象和屬性,它實質上是跨越整個 Web 應用程序,包括多個頁面、請求和會話的一個全局作用域。

17. session 和 cookie 有什么區別?

存儲位置不同:session 存儲在服務器端;cookie 存儲在瀏覽器端。

安全性不同:cookie 安全性一般,在瀏覽器存儲,可以被偽造和修改。

容量和個數限制:cookie 有容量限制,每個站點下的 cookie 也有個數限制。

 存儲的多樣性:session 可以存儲在 Redis 中、數據庫中、應用程序中;而 cookie 只能存儲在瀏覽器中。

18. 簡單工廠和抽象工廠有什么區別?

簡單工廠:用來生產同一等級結構中的任意產品,對于增加新的產品,無能為力。

工廠方法:用來生產同一等級結構中的固定產品,支持增加任意產品。

抽象工廠:用來生產不同產品族的全部產品,對于增加新的產品,無能為力;支持增加產品族。

19. 為什么要使用 spring?

 spring 提供 ioc 技術,容器會幫你管理依賴的對象,從而不需要自己創建和管理依賴對象了,更輕松的實現了程序的解耦。

spring 提供了事務支持,使得事務操作變的更加方便。

spring 提供了面向切片編程,這樣可以更方便的處理某一類的問題。

 更方便的框架集成,spring 可以很方便的集成其他框架,比如 MyBatis、hibernate 等。

20. 解釋一下什么是 aop?

aop 是面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。

 簡單來說就是統一處理某一“切面”(類)的問題的編程思想,比如統一處理日志、異常等。

21. 解釋一下什么是 ioc?

 ioc:Inversionof Control(中文:控制反轉)是 spring 的核心,對于 spring 框架來說,就是由 spring 來負責控制對象的生命周期和對象間的關系。

 簡單來說,控制指的是當前對象對內部成員的控制權;控制反轉指的是,這種控制權不由當前對象管理了,由其他(類,第三方容器)來管理。

22. spring 中的 bean 是線程安全的嗎?

 spring 中的 bean 默認是單例模式,spring 框架并沒有對單例 bean 進行多線程的封裝處理。

 實際上大部分時候 spring bean 無狀態的(比如 dao 類),所有某種程度上來說 bean 也是安全的,但如果 bean 有狀態的話(比如 view model 對象),那就要開發者自己去保證線程安全了,最簡單的就是改變 bean 的作用域,把“singleton”變更為“prototype”,這樣請求 bean 相當于 new Bean()了,所以就可以保證線程安全了。

有狀態就是有數據存儲功能。

無狀態就是不會保存數據。

23. spring 自動裝配 bean 有哪些方式?

no:默認值,表示沒有自動裝配,應使用顯式 bean 引用進行裝配。

byName:它根據 bean 的名稱注入對象依賴項。

byType:它根據類型注入對象依賴項。

構造函數:通過構造函數來注入依賴項,需要設置大量的參數。

 autodetect:容器首先通過構造函數使用 autowire 裝配,如果不能,則通過 byType 自動裝配。

 

上一篇:嵌入式開發有必要考研嗎?

下一篇:人工智能那么火~如今AI的應用場景都有哪些?

戳我查看嵌入式每月就業風云榜

點我了解華清遠見高校學霸學習秘籍

猜你關心企業是如何評價華清學員的

干貨分享
相關新聞
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2024 北京華清遠見科技發展有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部