Java工程師常見面試題集錦(一)網際網路人必看!(附答案及視訊教程,持續更新)

CSDN學院發表於2019-01-02

大牛也怕面試題,尤其是基礎題,在面試中如果出現一兩題回答不準確很有可能你就被拒之門外了。CSDN學院年終傾情奉獻,海量面試題(帶答案)免費分享,幫助大家順利過關。

面試題將會持續更新,今天先跟大家分享10道Java基礎相關的面試題。

如果覺得文字學習較慢,也可以跟著老師一起視訊學習:

Java面試題視訊學習連結:https://edu.csdn.net/course/detail/10533

1、物件導向的特徵有哪些方面?

物件導向的特徵主要有以下幾個方面:

1)抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地 注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一 部分,暫時不用部分細節。

抽象包括兩個方面:一是過程抽象,二是資料抽象。

2)繼承:繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。物件的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那裡繼承方法和例項變數 ,並且類可以修改或增加新的方法使之更適合特殊的需要。

3)封裝:封裝是把過程和資料包圍起來,對資料的訪問只能通過已定義的介面 。 物件導向計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治封裝的物件,這些物件通過一個受保護的介面訪問其他物件。

4)多型性:多型性是指允許不同類的物件對同一訊息作出響應。多型性包括引數化多型性和包含多型性。多型性語言具有靈活、抽象、行為共享、程式碼共享的 優勢,很好的解決了應用程式函式同名問題。

 

2、Java多型的具體體現

物件導向程式設計有四個特徵:抽象,封裝,繼承,多型。多型有四種體現形式:

1)介面和介面的繼承;

2) 類和類的繼承;

3)過載;

4) 重寫。

其中過載和重寫為核心。

過載:過載發生在同一個類中,在該類中如果存在多個同名方法,但是方法的引數型別和個數不一樣,那麼說明該方法被過載了;

重寫:重寫發生在子類繼承父類的關係中,父類中的方法被子類繼承,方法名、返回值型別、引數完全一樣,但是方法體不一樣,那麼說明父類中的該方法被子類重寫了。

 

3、什麼時候用 assert?

答:assertion(斷言)在軟體開發中是一種常用的除錯方式,很多開發語言中都支援這種機制。

一般來說,assertion 用於保證程式最基本、關鍵的正確性。 assertion 檢查通常在開發和測試時開啟。為了提高效能,在軟體釋出後,assertion 檢查通常是關閉的。在實現中,斷言是一個包含布林表示式的語句, 在執行這個語句時假定該表示式為 true;如果表示式計算為 false,那麼系統 會報告一個 Assertionerror。 斷言用於除錯目的: assert(a > 0); // throws an Assertionerror if a <= 0 斷言可以有兩種形式: assert Expression1 ;assert Expression1 : Expression2 , Expression1 應該總是產生一個布林值, Expression2 可以是得出一個值的任意表示式;這個值用於生成顯示更多除錯資訊的 String 訊息。

斷言在預設情況下是禁用的,要在編譯時啟用斷言,需使用 source 1.4 標記 : javac -source 1.4 Test.java 。要在執行時啟用斷言,可使用 -enableassertions 或者 -ea 標記。 要在執行時選擇禁用斷言,可使用 -da 或者 -disableassertions 標記。 要在系統類中啟用斷言,可使用 -esa 或者 -dsa 標記。還可以在包的基礎上啟用或者禁用斷言。可以在預計正常情況下不會到達的任何位置上放置斷言。斷言可以用於驗證傳遞給私有方法的引數。

不過,斷言不應該用於驗證傳遞給公有方法的引數,因為不管是否啟用了斷言,公有方法都必須檢查其引數。不過,既可以在公有方法中,也可以在非公有方法中利用斷言測試後置條件。另外,斷言不應該以任何方式改變程式的狀態。

 

4、String、StringBuffer 、StringBuilder 的區別:

String:字串常量,不可變,使用字串拼接時是不同的兩個空間;

StringBuffer:字串變數,可變,執行緒安全,字串拼接直接在字串後追加;

StringBuilder:字串變數,可變,非執行緒安全,字串拼接直接在字串後追加;

1)StringBuilder執行效率高於StringBuffer高於String;

2)String是一個常量,是不可變的,所以對於每一次+=賦值都會建立一個新的物件,StringBuffer和StringBuilder都是可變的,當進行字串拼接時採用append方法,在原來的基礎上進行追加,所以效能比String要高,又因為StringBuffer是執行緒安全的而StringBuilder是執行緒非安全的,所以StringBuilder的效率高於StringBuffer;

3)對於大資料量的字串的拼接,採用StringBuffer,StringBuilder。

 

5、陣列有沒有length()方法?String 有沒有length()方法?

答:陣列沒有length()方法,有length的屬性。String有length()方法。JavaScript中,獲得字串的長度是通過length屬性得到的,這一點容易和Java混淆。

 

題庫及視訊陸續更新,如有需要,請繼續關注~

Java面試題視訊學習連結:https://edu.csdn.net/course/detail/10533

 

6、char 型變數中能不能儲存一箇中文漢字?為什麼?

答:char型別可以儲存一箇中文漢字,因為Java中使用的編碼是Unicode(不選擇任何特定的編碼,直接使用字元在字符集中的編號,這是統一的唯一方法),一個char型別佔2個位元組(16bit),所以放一箇中文是沒問題的。

 

7、Java中如何實現序列化,有什麼意義?

序列化就是一種用來處理物件流的機制,所謂物件流也就是將物件的內容進行流化,可以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。序列化是為了解決物件流讀寫操作時可能引發的問題(如果不進行序列化可能會存在資料亂序的問題)。

要實現序列化,需要讓一個類實現Serializable介面,該介面是一個標識性介面,標註該類物件是可被序列化的,然後使用一個輸出流來構造一個物件輸出流並通過writeObject(Object obj)方法就可以將實現物件寫出(即儲存其狀態);如果需要反序列化則可以用一個輸入流建立物件輸入流,然後通過readObject方法從流中讀取物件。

 

8、Vector與ArrayList

1)Vector是執行緒同步的,所以它也是執行緒安全的,而Arraylist是執行緒非同步的,是不安全的。如果不考慮到執行緒的安全因素,一般用Arraylist效率比較高。

2)如果集合中的元素的數目大於目前集合陣列的長度時,Vector增長率為目前陣列長度的100%,而Arraylist增長率為目前陣列長度的50%。如果在集合中使用資料量比較大的資料,用Vector有一定的優勢。

3)如果查詢一個指定位置的資料,Vector和Arraylist使用的時間是相同的,如果頻繁的訪問資料,這個時候使用Vector和Arraylist都可以。而如果移動一個指定位置會導致後面的元素都發生移動,這個時候就應該考慮到使用linklist,因為它移動一個指定位置的資料時其它元素不移動。

ArrayList 和Vector是採用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便增加和插入元素,都允許直接序號索引元素,但是插入資料要涉及到陣列元素移動等記憶體操作,所以索引資料快,插入資料慢,Vector由於使用了synchronized方法(執行緒安全)所以效能上比ArrayList要差,LinkedList使用雙向連結串列實現儲存,按序號索引資料需要進行向前或向後遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入數度較快。

 

9、Arraylist和Linkedlist

1)ArrayList是實現了基於動態陣列的資料結構,LinkedList基於連結串列的資料結構。

2)對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為LinkedList要移動指標。

3)對於新增和刪除操作add和remove,LinedList比較佔優勢,因為ArrayList要移動資料。 這一點要看實際情況的,若只對單條資料插入或刪除,ArrayList的速度反而優於LinkedList。但若是批量隨機的插入刪除資料,LinkedList的速度大大優於ArrayList. 因為ArrayList每插入一條資料,要移動插入點及之後的所有資料。

 

10、HashMap與TreeMap

1)HashMap通過hashcode對其內容進行快速查詢,而TreeMap中所有的元素都保持著某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。

2)在Map中插入、刪除和定位元素,HashMap是最好的選擇。但如果您要按自然順序或自定義順序遍歷鍵,那麼TreeMap會更好。使用HashMap要求新增的鍵類明確定義了hashCode()和 equals()的實現。

兩個map中的元素一樣,但順序不一樣,導致hashCode()不一樣。

同樣做測試:

在HashMap中,同樣的值的map,順序不同,equals時,false;

而在treeMap中,同樣的值的map,順序不同,equals時,true;

說明,treeMap在equals( )時是整理順序了的。

 

題庫及視訊陸續更新,如有需要,請繼續關注~

Java面試題視訊學習連結:https://edu.csdn.net/course/detail/10533

相關文章