面試大廠,90%會被問到的Java面試題(附答案)

面向對象的三個特徵

封裝,繼承,多態

多態的好處,代碼中如何實現多態,虛擬機中如何實現多態

允許不同類對象對同一消息作出相應,好處如下:

可替換性:多態對已存在的代碼具有可替換性

可擴充性:增加新的子類不會影響已經存在的類結構

接口性:多態是超類通過方法簽名,向子類提供一個接口,由子類完善或重寫來實現

靈活性

簡化性

代碼中:接口實現,繼承父類重寫方法,同一類中方法重載

虛擬機中:動態綁定技術(dynamic binding),執行期間判斷所引用對象的實際類型,根據實際類型調用對應的方法

接口的意義,抽象類的意義

接口:規範,拓展,回調

抽象類:爲其他子類提供一個公共的類型;封裝子類中重複定義個內容;定義抽象方法,子類雖然有不同的實現,但是定義時是一致的

父類的靜態方法能否被子類重寫

不能。重寫只適用於實例方法,不能用於靜態方法,而子類當中含有和父類相同簽名的靜態方法,我們一般稱之爲隱藏。

什麼是不可變對象

不可變對象指對象一旦被創建,狀態就不能再改變。任何修改都會創建一個新的對象,如String,Integer等其他包裝類。

靜態變量和實例變量的區別

靜態變量存在方法區,屬於類所有。實例變量存儲在堆中,其引用存在當前線程棧。

能否創建一個包含可變對象的不可變對象

可以,需要注意不要共享可變對象的引用,如果需要變化時,就返回原對象的一個拷貝。舉例:日期對象。

Java創建對象的幾種方式

new,反射,clone(),通過序列化機制

Switch能否使用String做參數,能否作用在byte,long上

Java7以前不能使用String做參數,可以使用byte,short,char,int及封裝類和枚舉,Java7之後可以使用String,一直不能用long

說說string的intern()方法

intern()方法會先從常量池中查詢是否存在該常量值,如果不存在則創建,否則直接放回

Object有哪些公用方法

euqals(),toString(),clone(),wait(),notify(),nofifyAll(),getClass()

Java中的四種引用

強引用,軟引用,弱引用,虛引用。不同的引用類型主要體現在GC上:
       強引用:如果一個對象具有強引用,它就不會被垃圾回收器回收。即使當前內存空間不足,JVM也不會回收它,而是拋出 OutOfMemoryError 錯誤,使程序異常終止。如果想中斷強引用和某個對象之間的關聯,可以顯式地將引用賦值爲null,這樣一來的話,JVM在合適的時間就會回收該對象。
       軟引用:在使用軟引用時,如果內存的空間足夠,軟引用就能繼續被使用,而不會被垃圾回收器回收,只有在內存不足時,軟引用纔會被垃圾回收器回收。
       弱引用:具有弱引用的對象擁有的生命週期更短暫。因爲當 JVM 進行垃圾回收,一旦發現弱引用對象,無論當前內存空間是否充足,都會將弱引用回收。不過由於垃圾回收器是一個優先級較低的線程,所以並不一定能迅速發現弱引用對象。
       虛引用:顧名思義,就是形同虛設,如果一個對象僅持有虛引用,那麼它相當於沒有引用,在任何時候都可能被垃圾回收器回收。

WeakReference與SoftReference的區別

雖然 WeakReference 與 SoftReference 都有利於提高 GC 和 內存的效率,但是 WeakReference ,一旦失去最後一個強引用,就會被 GC 回收,而軟引用雖然不能阻止被回收,但是可以延遲到 JVM 內存不足的時候。

爲什麼要有不同的引用類型

不像C語言,我們可以控制內存的申請和釋放,在Java中有時候我們需要適當的控制對象被回收的時機,因此就誕生了不同的引用類型,可以說不同的引用類型實則是對GC回收時機不可控的妥協。有以下幾個使用場景可以充分的說明:

利用軟引用和弱引用解決OOM問題:用一個HashMap來保存圖片的路徑和相應圖片對象關聯的軟引用之間的映射關係,在內存不足時,JVM會自動回收這些緩存圖片對象所佔用的空間,從而有效地避免了OOM的問題.
       通過軟引用實現Java對象的高速緩存:比如我們創建了一Person的類,如果每次需要查詢一個人的信息,哪怕是幾秒中之前剛剛查詢過的,都要重新構建一個實例,這將引起大量Person對象的消耗,並且由於這些對象的生命週期相對較短,會引起多次GC影響性能。此時,通過軟引用和 HashMap 的結合可以構建高速緩存,提供性能。

Java中==和equals()的區別,equals()和hashcode()的區別及聯繫

==是運算符,比較兩個變量是否相等,而equals是Object類的方法,用來比較兩個對象是否相等。

默認equals方法比較兩個對象的地址,此時結果相同,如果要比較內容,則要重寫equals方法

hashcode()是Object類的一個方法,返回一個hash值,如果equals()相同則hashcode()相同,反之不然。

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

有可能,兩個不相等的對象可能有相同的hashcode值,只就是hashmap中會有衝突,如果對象相等,則hashcode相等,反之不然

可以在hashcode中使用隨機數字嗎

不可以,hashcode必須是相同的值

a==b與a.equals(b)有什麼區別

如果a和b都是對象,a==b比較的是引用,只有當a和b指向堆中同一個對象纔會返回true,而a.equals(b)進行邏輯比較,通常呀哦重寫該方法提供邏輯性一個的比。

3*0.1==0.3返回值是什麼

false,因爲有些浮點數不能精確的表示出來

a=a+b與a+=b有什麼區別嗎

+= 操作符會隱式轉換,例如下題

short s1 = 1;s1 = s1 +1;該代碼是否有錯誤,如果有錯誤怎麼修改

有錯誤,s1 = (short)(s1+1);

short s1 = 1;s1+= 1是否有錯誤,如果有錯誤怎麼修改

+=操作符會自動對右邊的表達式結果強轉匹配左邊的數據類型,所以沒錯

&與&&的區別

前者是位操作,後者是邏輯運算符

一個Java內部可以有類?(非內部類)

一個Java內部只能有一個public的類,可以有多個default的類

如何正確的退出多層嵌套循環

使用標號和break;

內部類的作用

內部類提供了更好的封裝,除了該外圍類,其他類都不能訪問

final,finally,finalize的不同之處

fianl是一個修飾符,可以修飾類,方法,變量的。finally是一個關鍵字,捕獲異常是與try連用的,一定會執行。finalize是在對象被回收之前調用的方法,給對象自己最後一個復活的機會,但是什麼時候調用finalize沒有保證

clone()是哪個類的方法

java.lang.Cloneable的一個標示性接口,不包含任何方法,clone方法在object中定義,clone()方法是一個本地方法,是由c或c++實現的

深拷貝和淺拷貝的區別是什麼

淺拷貝:僅僅複製所考慮的對象,而不復制它引用的對象

深拷貝:所有的對象都複製

static有哪些用法

靜態變量和靜態方法,被類實例所共享。

靜態塊,初始化操作。

修飾內部類,爲靜態內部類

導包,指定導入某個類中的靜態資源,並且不需要使用類名

final有哪些用法

被final修飾的方法不能被繼承,修飾的方法不能被重寫,修飾的變量不能被改變。被final修飾的方法,JVM會嘗試將其內關聯,以提高運行效率,被修飾的變量會在編譯階段存在常量池中。

編譯器對final域要遵守兩個重排規則:

1,在構造器內對一個final域的寫入,與隨後把這個構造對象的引用賦值給一個引用變量,這兩個操作之間不能重排序

2,初次讀一個包含final域對象的引用,與隨後初次讀這個final域,這兩個操作之間不能重排序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章