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


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

前言

不知不覺已經大三結束了,最近也在准備實習面試,打算把一些面試問到的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


免責聲明!

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



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