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

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

前言

不知不覺已經大三結束了,最近也在準備實習面試,打算把一些面試問到的Java基礎問題記錄一下,其實我我的面的仍是比較基礎簡單的,大廠也目前就這水平也不敢投,因此就只能投一些要求仍是比較低的,面試這塊會長期記錄,畢竟也是對本身問題的反饋記錄。
如下部分是Java基礎,至於數據庫、JavaWeb、框架、Linux、中間件、微服務還在記錄修改當中。java


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

image

也在這裏祝今年面試Java的夥伴能夠一帆風順順水數據庫


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


1、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修飾的,同理可知它也是不可繼承的。


2、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)。


3、多線程

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.怎樣保證多線程的運行安全

答:線程安全體如今三個方面:一是原子性(提供互斥訪問,同一時刻只能有一個線程對數據進行操做),二是可見性(一個線程對主內存的修改能夠及時的被其餘線程看到),三是有序性(一個線程觀察其餘線程中的指令執行順序,因爲指令重排序,該觀察結果通常雜亂無章)。


3、反射

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

答:首先反射主要是指程序能夠訪問、檢測和修改它自己狀態或行爲的能力;其次再Java運行環境中,咱們能夠對任意一個類,知道有哪些屬性和方法,對於任意一個對象,可否調用它的任意一個方法;即在運行時判斷任意一個對象所屬的類和這個類所具備的成員變量和方法,還有就是在運行時去構造任意一個類的對象和任意一個對象的方法。


4、異常

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這方面資料是真的多,但可能是多,但是大部分都吃灰了,因此平時也是隨便看看,並無去從頭至尾看一遍;在這我只記錄了一下我面的四五家問的問題,比較少,並且大部分都是我我的主觀回答,我的也不是學的很深刻,最近是儘可能把其餘相關的面試問題都記錄完成。

基礎這塊建議

一、面試放平心態,沒關係張,緊張會讓人變得吞吞吐吐,不自信,並且大腦一片空白。
二、有時間多看看源碼,好比集合、多線程這塊,仍是感受頗有用的。
三、簡歷上寫某些技術的時候仍是慎重一點,多思考爲何、怎麼用。
四、敘述主觀問題,我感受star法則很好(情境(situation):指事情是在什麼狀況下發生

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

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

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


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

相關文章
相關標籤/搜索