Java常見面試題及答案匯總,2021年最新版


2021最新Java面試題【附答案解析】java面試題及答案2021,java2021最新面試題及答案,2021最Java面試題新答案已經全部更新完了,有些答案是自己總結的,也有些答案是在網上搜集整理的。這些答案難免會存在一些錯誤,僅供大家參考。如果發現錯誤還望大家多多包涵,不吝賜教,謝謝~

1、抽象工廠模式和原型模式之間的區別?

抽象工廠模式:通常由工廠方法模式來實現。但一個工廠中往往含有多個工廠方法生成一系列的產品。這個模式強調的是客戶代碼一次保證只使用一個系列的產品。當要切換為另一個系列的產品,換一個工廠類即可。

原型模式:工廠方法的最大缺點就是,對應一個繼承體系的產品類,要有一個同樣復雜的工廠類的繼承體系。我們可以把工廠類中的工廠方法放到產品類自身之中嗎?如果這樣的話,就可以將兩個繼承體系為一個。這也就是原型模式的思想,原型模式中的工廠方法為clone,它會返回一個拷貝(可以是淺拷貝,也可以是深拷貝,由設計者決定)。為了保證用戶代碼中到時可以通過指針調用clone來動態綁定地生成所需的具體的類。這些原型對象必須事先構造好。

原型模式想對工廠方法模式的另一個好處是,拷貝的效率一般對構造的效率要高。

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

出現線程安全問題的原因一般都是三個原因:

1、 線程切換帶來的原子性問題 解決辦法:使用多線程之間同步synchronized或使用鎖(lock)。

2、 緩存導致的可見性問題 解決辦法:synchronized、volatile、LOCK,可以解決可見性問題

3、 編譯優化帶來的有序性問題 解決辦法:Happens-Before 規則可以解決有序性問題

3、volatile 修飾符的有過什么實踐?

一種實踐是用 volatile 修飾 long 和 double 變量,使其能按原子類型來讀寫。double 和 long 都是64位寬,因此對這兩種類型的讀是分為兩部分的,第一次讀取第一個 32 位,然后再讀剩下的 32 位,這個過程不是原子的,但 Java 中 volatile 型的 long 或 double 變量的讀寫是原子的。volatile 修復符的另一個作用是提供內存屏障(memory barrier),例如在分布式框架中的應用。簡單的說,就是當你寫一個 volatile 變量之前,Java 內存模型會插入一個寫屏障(write barrier),讀一個 volatile 變量之前,會插入一個讀屏障(read barrier)。意思就是說,在你寫一個 volatile 域時,能保證任何線程都能看到你寫的值,同時,在寫之前,也能保證任何數值的更新對所有線程是可見的,因為內存屏障會將其他所有寫的值更新到緩存。

4、Java中各種數據默認值

1、 Byte,short,int,long默認是都是0

2、 Boolean默認值是false

3、 Char類型的默認值是’’

4、 Float與double類型的默認是0.0

5、 對象類型的默認值是null

5、說說Java 垃圾回收機制

在 Java 中,程序員是不需要顯示的去釋放一個對象的內存的,而是由虛擬機自行執行。在 JVM 中,有一個垃圾回收線程,它是低優先級的,在正常情況下是不會執行的,只有在虛擬機空閑或者當前堆內存不足時,才會觸發執行,掃面那些沒有被任何引用的對象,並將它們添加到要回收的集合中,進行回收。

6、有沒有可能兩個不相等的對象有有相同的 hashcode?

有可能,兩個不相等的對象可能會有相同的 hashcode 值,這就是為什么在 hashmap 中會有沖突。相等 hashcode 值的規定只是說如果兩個對象相等,必須有相同的hashcode 值,但是沒有關於不相等對象的任何規定。

7、synchronized 和 Lock 有什么區別?

1、 首先synchronized是Java內置關鍵字,在JVM層面,Lock是個Java類;

2、 synchronized 可以給類、方法、代碼塊加鎖;而 lock 只能給代碼塊加鎖。

3、 synchronized 不需要手動獲取鎖和釋放鎖,使用簡單,發生異常會自動釋放鎖,不會造成死鎖;而 lock 需要自己加鎖和釋放鎖,如果使用不當沒有 unLock()去釋放鎖就會造成死鎖。

4、 通過 Lock 可以知道有沒有成功獲取鎖,而 synchronized 卻無法辦到。

8、什么是Vector

Vector與ArrayList一樣,也是通過數組實現的,不同的是它支持線程的同步,即某一時刻只有一個線程能夠寫Vector,避免多線程同時寫而引起的不一致性,但實現同步需要很高的花費,訪問它比訪問ArrayList慢很多

ArrayList是最常用的List實現類,內部是通過數組實現的,它允許對元素進行快速隨機訪問。當從ArrayList的中間位置插入或者刪除元素時,需要對數組進行復制、移動、代價比較高。因此,它適合隨機查找和遍歷,不適合插入和刪除。ArrayList的缺點是每個元素之間不能有間隔。

9、對象的訪問定位有哪幾種方式?

建立對象就是為了使用對象,我們的Java程序通過棧上的 reference 數據來操作堆上的具體對象。對象的訪問方式有虛擬機實現而定,目前主流的訪問方式有使用句柄和直接指針2種:

句柄:如果使用句柄的話,那么Java堆中將會划分出一塊內存來作為句柄池,reference 中存儲的就是對象的句柄地址,而句柄中包含了對象實例數據與類型數據各自的具體地址信息。

直接指針:如果使用直接指針訪問,那么 Java 堆對象的布局中就必須考慮如何放置訪問類型數據的相關信息,而reference 中存儲的直接就是對象的地址。

這兩種對象訪問方式各有優勢。使用句柄來訪問的最大好處是 reference 中存儲的是穩定的句柄地址,在對象被移動時只會改變句柄中的實例數據指針,而 reference 本身不需要修改。使用直接指針訪問方式最大的好處就是速度快,它節省了一次指針定位的時間開銷。

10、equals 和 == 的區別?#

通俗點講:是看看左右是不是一個東西。equals是看看左右是不是長得一樣。如何記住嘛。如果單純是想記住,:等於。equals:相同。兩個長得一樣的人,只能說長的相同(equals),但是不等於他們倆是一個人。你只要記住equals,==就不用記了。

術語來講的區別:

1、 ==是判斷兩個變量或實例是不是指向同一個內存空間 equals是判斷兩個變量或實例所指向的內存空間的值是不是相同

2、 ==是指對內存地址進行比較 equals()是對字符串的內容進行比較3.==指引用是否相同 equals()指的是值是否相同


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM