面試問題記錄 一 (基礎部分)

余月七發表於2021-07-28

面試問題記錄(一) 基礎部分

前言

不知不覺已經大三結束了,最近也在準備實習面試,打算把一些面試問到的Java基礎問題記錄一下,其實我個人面的還是比較基礎簡單的,大廠也目前就這水平也不敢投,所以就只能投一些要求還是比較低的,面試這塊會長期記錄,畢竟也是對自己問題的反饋記錄。
以下部分是Java基礎,至於資料庫、JavaWeb、框架、Linux、中介軟體、微服務還在記錄修改當中。


最近也是在看東京奧運會,中國已經12金6銀9銅,祝中國隊一往無前,加油,加油,加油!!!

image

也在這裡祝今年面試Java的夥伴可以一路順風順水


如果記錄中有什麼問題是解釋不正確的、偏離比較多的,請各位大佬個小夥伴及時糾正我的錯誤!


一、Java基礎

1.JDK和JRE有什麼區別?

答:JDK是Java的開發工具包(在開發工具中如果選擇JDK完整環境,可以看到底層原始碼,但是JRE環境的話,只能看到“.class”檔案原始碼),也就是進行除錯執行Java的環境,而且包含JRE,JRE是Java的執行環境,如果僅僅是執行Java程式,則只需要安裝JRE即可。

2.==和equals的區別?

答:我們通過JDK原始碼,可以知道equals本質上就是"=="

但由於String和Integer等封裝類重寫了equals方法,所以equals預設情況下是引用比較,而在String、Integer中是變成了值比較,所以一般情況下是判斷值是否相等;而“==“對於基本型別來說是值比較,對於引用型別來說是引用比較

3.final在Java中的作用

答:首先是它修飾的類是不能被繼承的,其次修飾的方法是不能被重寫,最後修飾的變數叫做常量,且初始化之後不能被修改.

4.Java中的資料結構有哪些,基本資料型別呢?

答:資料結構八種有陣列、連結串列、佇列、雜湊表、棧、堆、圖、樹;基本資料型別八種byte、short、int、long、float、double、Boolean、char

5.兩個物件的hashCode()相同,則equals()也一定是ture嗎?

答:不是,在雜湊表中,hashCode()相等即是兩個鍵值對的雜湊值相等,然而雜湊值相等,並不一定能得出鍵值對相等。

6.Java中操作字串都有哪些類?有什麼區別?String類常用的方法有?

答:String、StringBuider、StringBuffer;String宣告的是不可變的物件,每次操作都會生成新的String物件,然後將指標指向新的String物件,而StringBuffer和StringBuilder修飾的變數,但StringBuffer是執行緒安全的(其中方法是用synchronize關鍵字修飾的),且效能比StringBuilder高。String類中常用的方法有length返回字串長度、indexOf返回指定字元索引、charAt返回指定索引處的字元、equals字串比較、subString擷取字串、replace替換字串。

7.抽象類和介面的區別?

答:一是類只能繼承一個抽象類,而可以實現多個介面;二是抽象類中有無參構造方法,介面中不能有;三是抽象類中方法修飾可以是各種,而介面中只能是public;四是抽象類中可以有main方法,但介面中不行。

8.抽象類還有什麼要求嗎?

答: 抽象類中可以包含抽象方法,但不同類中不可以;抽象類不能直接例項化、普通類可以;抽象類不能用final關鍵字修飾;抽象類中不一定有抽象方法。

9.IO流有了解嗎?

答:首先是輸入輸出流input和output,其次可分為位元組流和字元流;位元組流是按8位傳輸、字元流是16位

10.連結串列和陣列有什麼區別

答:連結串列是鏈式儲存結構,⽽陣列是順序儲存結構,也就是連結串列可以存放在記憶體中不同的區域,陣列是⼀塊連續的區域,所以陣列隨機讀取率⽐較⾼,但它擴充套件不⽅便,新增和刪除的效率較低,相反連結串列的話,查詢、新增、刪除較快,擴充套件⽅便。

11.Java中的資料結構和基本資料型別

答:資料結構和基本資料型別都有八種,資料結構有陣列、連結串列、佇列、雜湊表、堆、棧、圖、樹;基本資料型別有位元組byte佔1個位元組、短整型short佔2個位元組、整型int佔4個位元組、長整型long佔8個位元組、單精度float佔4個位元組、雙精度double佔8個位元組、布林boolean佔1位按計算機最低計算單位就是1位元組、字元char佔2個位元組。

12.String為什麼不可變?

答:因為String類是用final這關鍵字修飾的,而且底層中實現儲存的value陣列是用final修飾的,同理可知它也是不可繼承的。


二、Java容器

1.List和Set的區別是什麼?

答:它們都是繼承Collection集合介面,List中存放的元素是可重複、有序的而set中是不可重複無序的(set中的無序是可以由HashCode決定);List下有ArrayList和LinkedList、Vector集合,Set下有HashSet、TreeSet集合

2.解釋一下Map實現原理

答:Map是一種資料儲存容器,資料是以鍵值對的形式進行儲存,也就是底層是以雜湊表的方式實現的,而雜湊表在JDK8之前是陣列+連結串列,而從JDK8開始是以陣列+連結串列+紅黑樹的方式實現的。Map下主要有兩個實現類HashMap和TreeMap;HashMap插入、刪除和定位元素很快,如果是對一個有序的Key集合進行遍歷則選TreeMap;
具體Map實現原理可參考這篇博文 (Map實現原理)

3.如何實現List和陣列的轉換?

答:List轉陣列呼叫toArray方法,陣列轉List呼叫Arrays的asList方法

4.ArrayList和LinkedList的區別是什麼?

答:ArrayList底層資料結構是雙向連結串列、支援隨機訪問;LinkedList底層資料結構是雙向迴圈連結串列、不支援隨機訪問;而且前者時間複雜度是O(1)而後者是O(n)。


三、多執行緒

1.建立執行緒有哪幾種方式?說說它們有什麼區別?

答:一是繼承Thread類,建立例項,重寫run方法,二是實現Runable介面,重寫介面中run方法,三是通過Callable和Future建立,第三種並未瞭解過。前兩種⽅式都是通過run這個⽅法來建立執行緒,然後通過start啟動執行緒;不管是哪兩種⽅式,最終都是通過調⽤Thread類的物件的API來控制執行緒。相⽐繼承類的⽅式,實現接⼝的⽅式⼀是適合多個相同的程式程式碼處理同⼀個資源,⼆是程式碼可以被多個執行緒共享,三是避免了單繼承,四是執行緒池只能放⼊實現runable或callable類執行緒,不能直接放⼊繼承Thread的類中。

2.執行緒的run方法和start方法有什麼區別?

答:每個執行緒都是通過某個特定Thread物件所對應的方法run()來完成其操作的,方法run成為執行緒體,通過呼叫Thread類的start方法來啟動執行緒;而run方法只是執行緒中的一個方法,而不是多執行緒的,直接呼叫run方法必須等待run方法執行完畢才能執行接下來的程式碼,所以執行路徑還是隻有一條,沒有多執行緒的特徵;而start是用來啟動一個執行緒,也真正實現了多執行緒執行,也就是無需等待run方法體程式碼執行完畢,可以直接繼續執行下面的程式碼,這時候執行緒是處於就緒狀態,然後通過此Thread類呼叫run方法來完成

其執行狀態,而run此時稱為執行緒體,它包含了要執行的這個執行緒的內容,run方法執行結束,此執行緒終止。

3.建立執行緒池的幾種方式?

答:Executors工具類是通過呼叫底層ThreadPoolExecutor構造方法實現執行緒池的建立,一是建立定長的執行緒池,二是建立單執行緒化的執行緒池,三是建立可快取的執行緒池,四是建立一個支援執行緒定時操作和週期操作的執行緒池。
具體參考這篇文章:ThreadPoolExecutor執行緒池解析及Executor建立執行緒常見四種方式

4.synchronize和volatile的區別是什麼?

答:一是synchronize關鍵字可以使用在變數、方法、和類別之前,而volatile只能使用在變數上;二是synchronize是鎖定當前變數,只有當前執行緒可以訪問該變數,其他執行緒被阻塞住,而volatile是告訴jvm當前變數在暫存器中的值不確定,需要從主存中讀取;三是synchronize可能造成執行緒阻塞,而volatile不會;四是synchronize可以保證變數的修改可見性和原子性,而volatile只能實現變數修改可見性,不能保證原子性;五是synchronize標記的變數可以被編譯器優化,volatile標記的變數不會被編譯器優化。

5.怎樣保證多執行緒的執行安全

答:執行緒安全體現在三個方面:一是原子性(提供互斥訪問,同一時刻只能有一個執行緒對資料進行操作),二是可見性(一個執行緒對主記憶體的修改可以及時的被其他執行緒看到),三是有序性(一個執行緒觀察其他執行緒中的指令執行順序,由於指令重排序,該觀察結果一般雜亂無章)。


三、反射

1.反射是什麼?有什麼用?

答:首先反射主要是指程式可以訪問、檢測和修改它本身狀態或行為的能力;其次再Java執行環境中,我們可以對任意一個類,知道有哪些屬性和方法,對於任意一個物件,能否呼叫它的任意一個方法;即在執行時判斷任意一個物件所屬的類和這個類所具有的成員變數和方法,還有就是在執行時去構造任意一個類的物件和任意一個物件的方法。


四、異常

1.final、finally和finalize有什麼區別?

答:final可以修飾類、變數、方法,表示該類不能被繼承、該方法不能被重寫、該變數不能被賦值;finally主要是處理異常的時候用,也就是finally程式碼塊中的程式碼都會執行,一般用來存放一些關閉資源的程式碼。finalize是屬於Object類的一個方法,即當我們去呼叫System的gc方法時候,由垃圾回收器呼叫finalize方法,回收垃圾。

2.try-catch-finally的出口是什麼,catch中return後,finally還會執行嗎?

答:try只適合處理執行時異常,try+catch適合處理執行時異常+普通異常,因為由於Java編譯器的硬性規定,普通異常如果選擇捕獲,就必須使用catch顯示宣告異常並進一步處理;出口的話一個就是自己進行處理,第二個是丟擲給JVM虛擬機器由虛擬機器進行處理,finally的話就是不管最後有沒有捕獲異常都進行掃尾處理。而catch中有return語句的話,finally在return之前執行。

3.說說你寫程式碼的時候遇到的一些異常

答:NullPointerException空指標異常(訪問了空物件,則丟擲該異常),SQLException資料庫異常(有資料庫的錯誤資訊)、NumberFormatException數字格式化異常(型別轉換失敗時)、IOException異常(發生I/O操作失敗或中斷時的丟擲)、ClassCastException(當物件強制轉換為不是例項的子類時丟擲)、IllegalArgumentException(不合法引數)、RuntimeException(JVM虛擬機器正常執行時丟擲的異常超類)。


最後

其實網上面經是很多,Java這方面資料是真的多,但多是多,可是大部分都吃灰了,所以平時也是隨便看看,並沒有去從頭到尾看一遍;在這我只記錄了一下我面的四五家問的問題,比較少,而且大部分都是我個人主觀回答,個人也不是學的很深入,最近是儘量把其他相關的面試問題都記錄完成。

基礎這塊建議

1、面試放平心態,不要緊張,緊張會讓人變得吞吞吐吐,不自信,而且大腦一片空白。
2、有時間多看看原始碼,比如集合、多執行緒這塊,還是感覺很有用的。
3、簡歷上寫某些技術的時候還是慎重一點,多思考為什麼、怎麼用。
4、敘述主觀問題,我感覺star法則很好(情境(situation):指事情是在什麼情況下發生

任務(task):你是如何明確你的任務的
;行動(action):針對這樣的情況分析,你採用了什麼行動方式;

結果(result):結果怎樣,在這樣的情況下你學習到了什麼

5、基礎問題答不上來,不要氣餒,面試講究自信。


祝各位小夥伴一路過關斬將,面到自己心儀的崗位!
image

相關文章