Java實習面試題集合

我就是把博主沒回答的問題添加上了,爲過幾天找工作做準備!!!!
一、Java基礎

1、ArrayList和LinkedList的區別?(鏈表和數組的優缺點)
答:ArrayList是一個動態的數組結構,而LinkedList是雙向鏈表結構;存取數據的時候,ArrayList更適合按位隨機存取,而LinkedList更適合順序讀存取;插入/刪除數據時,ArrayList的開銷就比LinkedList更大,因爲對於ArrayList,插入/刪除一個數據時需要移動其後所有數據,而LinkedList只需要修改幾個指針即可。
2、HashMap是怎樣的結構?工作原理是什麼?退化成鏈表解決方法?
答:HashMap的本質仍然是數組,不過數組中存儲的不是數據,而是一個鏈表的頭節點。所以準確的說,其實現就是鏈表數組。HashMap中保存的是一個鍵值對,插入對象時必須提供一個鍵對象;查找對象時必須給定一個鍵對象(因此必須記住鍵)。鍵對象時不允許重複的,但是允許null空鍵的存在。
HashMap插入對象時,根據給定的鍵key計算hashcode,然後再與數組長度進行求餘運算得到數組下標。然後與該位置上的鏈表中已存儲的鍵進行比較,對於已存在的鍵,則覆蓋;對於不存在的鍵,則添加到鏈表尾。
HashMap工作原理: http://www.admin10000.com/document/3322.html
HashMap基於hashing原理,我們通過put()和get()方法儲存和獲取對象。當我們將鍵值對傳遞給put()方法時,它調用鍵對象的hashCode()方法來計算hashcode,讓後找到bucket位置來儲存值對象。當獲取對象時,通過鍵對象的equals()方法找到正確的鍵值對,然後返回值對象。HashMap使用LinkedList來解決碰撞問題,當發生碰撞了,對象將會儲存在LinkedList的下一個節點中。 HashMap在每個LinkedList節點中儲存鍵值對對象。
當兩個不同的鍵對象的hashcode相同時會發生什麼? 它們會儲存在同一個bucket位置的LinkedList中。鍵對象的equals()方法用來找到鍵值對。
key對象相同則覆蓋,hashcode相同則添加到鏈表尾。
退化成鏈表解決方法?
JDK7中確實會有這樣的問題,因爲鏈表法有這樣的缺陷。但是在JDK8中,Java會在鏈表長度超過一個闕值的時候將鏈表升級爲一個平衡二叉樹,使用hashcode作爲樹的分支變量,較大的會插入到右子樹中;hashcode相等的情況下,HashMap希望Key對象是實現了Comparable接口的,這樣就可以按照順序插入。
鍵對象的選擇->選擇String對象作爲鍵對象最好,因爲String具有不可變性。

3、棧和隊列的區別是什麼?
答:隊列允許頭出尾進,而棧只允許從棧頂進出。簡單說:吃多了拉就是隊列;吃多了吐就是棧。

4、排序算法相關:時間複雜度、空間複雜度、穩定性。
在這裏插入圖片描述
5、Java的垃圾回收機制是怎樣的?回收的是什麼樣的對象?
答:Java垃圾回收器實現對堆內存數據的自動回收,無需程序員顯式地調用delete放啊。Java的垃圾自動回收機制有效地避免了因爲程序員忘記釋放內存而造成的內存溢出錯誤。
Java使用被稱爲垃圾收集器的技術來監視Java程序的運行,當對象不再被使用時,即不再被引用時,就會自動釋放對象所佔用的內存。Java使用一系列軟指針來跟蹤對象的各個引用,這些軟指針並不直接指向對象,而是指向對象的引用。通過軟指針,Java的垃圾收集器能夠以單獨的線程在後臺運行,並不時檢查每個對象的引用。
調用System的靜態方法gc()可以運行垃圾收集器,但是並不能保證立即回收指定對象。(這就是建議回收,不能強迫回收。)
finalize()方法可以終止一個對象來釋放資源,調用之後對象不再被引用,就會被回收。

6、什麼是堆內存?什麼是棧內存?有什麼區別?
答:Java的內存空間分爲堆內存和棧內存。棧內存用於存儲定義的基本類型變量、函數返回值、對象的引用等,而堆內存用於存放new出來的一切對象。

7、尾遞歸是怎樣的?與遞歸的比較?
答:尾遞歸,也即在尾部進行遞歸的一種遞歸形式,指的是在一次遞歸執行完畢,返回上一層之後,不在進行任何操作,也即在迴歸的過程中不做任何操作,且返回值不屬於表達式的一部分。
當編譯器檢測到一個函數調用是尾遞歸的時候,它就覆蓋當前的活動記錄而不是在棧中去創建一個新的。編譯器可以做到這點,因爲遞歸調用是當前活躍期內最後一條待執行的語句,於是當這個調用返回時棧幀中並沒有其他事情可做,因此也就沒有保存棧幀的必要了。通過覆蓋當前的棧幀而不是在其之上重新添加一個,這樣所使用的棧空間就大大縮減了,這使得實際的運行效率會變得更高。

8、什麼是進程、什麼是線程?進程和線程有什麼區別?怎樣定義線程?
答:進程是某個程序在某個數據集上的一次活動,是系統資源分配的最小單位。
線程是進程的一個實體,是系統進行調度的最小單位;線程基本不擁有資源,它與其他線程共享進程的資源。

9、死鎖是怎麼產生的?怎麼解決死鎖的問題?
答:死鎖是多個進程競爭共享資源產生的,若無外力作用,這些進程將永遠無法前進。

10、什麼是優先級隊列?優先級隊列有什麼用?
答:優先級隊列,因爲一般用二叉堆來實現,因此又稱爲堆。它的每一個父節點的值都比孩子節點大(或者小)。它的工作是查找或者刪除優先隊列中的最大值(或最小值)

11、什麼是二叉搜索樹?
答:二叉搜索樹,是一種特殊的二叉樹,其每一個父節點的值都大於左孩子節點,且小於右孩子節點。

12、重載和重寫的區別? 子類可以重載父類的方法嗎?
答:重載:指的是同名的方法擁有不同的參數列表,而系統調用函數是能夠根據參數列表選擇正確的方法。
重寫:指的是是對父類方法的一種覆蓋。
子類不可以重載父類的方法,只能重寫。

13、說說你對於static關鍵字的理解。
答:static修飾的域屬於這個類,而不屬於具體的某一個對象。
static方法是一種不能向對象實施操作的方法,換句話說,靜態方法不需要訪問對象的狀態,所有的參數都來自於顯式的參數。
14、生產者消費者模型?如何定義?
答:https://www.cnblogs.com/chentingk/p/6497107.html
15、線程安全是什麼意思?
答:http://www.cnblogs.com/molao-doing/articles/8908239.html
16、說出final,finalize,finally的區別?
答:https://www.cnblogs.com/ktao/p/8586966.html
17、列舉你常用的幾個Java工具類。
答:https://blog.csdn.net/wu1226419614/article/details/72673686
18、HashMap與HashSet哪個更快?它們有什麼不同?
答:https://blog.csdn.net/dearyangjie/article/details/78451969
二、設計模式
1、代理模式的適用場景?
答:所謂代理模式,即爲一個對象創建一個代理,以控制對這個對象的訪問。
使用代理的兩種場景:
控制訪問權限,不同用戶對同一對象擁有不同的訪問權限
某個客戶端不能直接操作到某個對象,卻又必須與其進行交互
三、數據庫基礎
事務的四個特性
答:事務,是應用程序中一系列嚴密的操作,所有操作必須全部完成,否則在每個操作中的更改都會被撤銷。也就是說,一個事務中的所有操作要麼全部執行,要麼全不執行。
四個特性:ACID
A:原子性,事務是數據庫的邏輯工作單位,事務中包含的操作,要麼都做,要麼都不做。
C:一致性,事務執行的結果必須是使數據庫從一個一致性狀態到另一個一致性狀態。
I :隔離性,一個事務的執行不能干擾其他事務。
D:持續性,也即永久性,指的是一個事務執行後對數據庫數據的更改是永久性的。
什麼是索引?
四、網絡基礎
TCP和UDP的區別?
什麼是HTTP協議?
TCP和HTTP的關係?
三次握手是怎樣的過程?
TCP如何確認對方收到了消息?
五、其他
請你簡單的自我介紹一下
請問你看過哪些技術方面的書籍?
你平常會關注一些技術論壇嗎?
你的優勢在哪裏?
你還有什麼要補充的嗎?
你還有什麼問題嗎?
來自:https://blog.csdn.net/u010486697/article/details/62281208

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