2020Java面试题汇总(2020年负重前行的Java码畜社招遇到的Java面试题---亲历总结)
終于熬過2020,分享一下負重前行的一年遇到的Java面試題
- 一、Java基礎面試
- 1、多線程和線程池(高頻重點考點·必備技能)
- 2、集合(常見考點)
- 3、其他基礎問題(必備基礎)
- 4、數據庫基礎
- 5、Redis---非關系型數據庫
- 6、Linux相關基礎和指令
- 7、框架:
- 8、前端技術
- 9、最后
前言:今年是個不平靜的一年。博主去年臨近畢業因為公司單方面毀約的原因,畢業被趕出校,倉促進了一家做人臉識別的小公司。對公司的知遇之恩其實一直銘記在心,老大人也特別好。由于開發團隊人員較少的原因,這一年來前端后端安卓端都在寫,接觸得多、但是每個領域都不精。一年下來真的沒啥技術上的沉淀。更多的就是CRUD。上半年遇到疫情,下半年項目在手,換工作的計劃一直被拖后。現在手上的項目也馬上試點了,自己也在陸續投遞簡歷。嘗試新機會。才發現自己的技術面還是太窄了。本應精通的后端也只會CRUD和SSM。最近也面了幾個公司。也總結了一下遇到的面試題。在這兒分享一下。
-
因為還在職,要帶實習生和跟項目。所以也沒全身心地投入到找工作中。九月份開始陸陸續續面過一些公司,有大有小、有國企有私企,仿佛回到了去年不停去各個學校聽宣講會的秋招。由于今年行情整體不是很好,待遇好多都不怎么樣,自己滿意的人家不要我,人家要我的我又不想去。收效也甚微。最近工作也基本落實了。來跟大家分享一下這期間我遇到的一些問題吧。
-
注: 社招不同于校招,基礎也會問,但大多會偏向于更深層的方向去問。博主一年多工作經驗,投的都是一年多左右的崗位。別看我年限,我是個菜雞。以下都是我遇到的,太多了總結了一些,有的寫了沒寫。挑些重要的講一下吧!
一、Java基礎面試
1、多線程和線程池(高頻重點考點·必備技能)
(1)、線程的創建方式和生命周期
-
一般有四種辦法:繼承Thread、實現Runable接口、實現Callable接口、線程池創建線程。
-
a、創建線程類繼承Thread,重寫run方法,然后進行調用。
- b、實現Runable接口
- c、實現Callable接口
- d、線程池創建(后面在細節講各個參數)
(2)、start()和run()的區別
- tart與run方法的主要區別在于當程序調用start方法一個新線程將會被創建,并且在run方法中的代碼將會在新線程上運行,然而在你直接調用run方法的時候,程序并不會創建新線程,run方法內部的代碼將在當前線程上運行。
(3)、線程池的創建方法
- 見第(4)題
(4)、線程池的幾個重要參數
- 見第(5)題
(5)、各個參數值的設置有哪些講究
- 傳送門》》》線程池的介紹《《
2、集合(常見考點)
(1)、常見的集合list、set、map 子類介紹一下,原理、應用場景
- 傳送門 》》list、set、map區別和應用場景《《
(2)、HashMap發生hash沖突是怎么解決的,1.8之后引入了什么東西解決,鏈表過長(紅黑樹)。
- a、在java編程語言中,最基本的結構就是兩種,一個是數組,另外一個是模擬指針(引用),所有的數據結構都可以用這兩個基本結構來構造的,HashMap也不例外。HashMap實際上是一個“鏈表散列”的數據結構,即數組和鏈表的結合體。
- b、當我們往HashMap中put元素的時候,先根據key的hashCode重新計算hash值,根據hash值得到這個元素在數組中的位置(即下標),如果數組該位置上已經存放有其他元素了,那么在這個位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放在鏈尾。如果數組該位置上沒有元素,就直接將該元素放到此數組中的該位置上。
(3)、HashMap的key存對象可以么,會出現什么問題
- 這個問題博主專門搜了下,看這篇博客看懂的,可以參考下!
- 》》傳送門《《
(4)、多線程操作ArrayList如何實現線程安全,那個關鍵字可以實現
-
a、Collections.synchronizedList(List list)
-
b、CopyOnWriteArrayList
- Description:CopyOnWriteArrayList和Collections.synchronizedList是實現線程安全的列表的兩種方式。兩種實現方式分別針對不同情況有不同的性能表現。其中CopyOnWriteArrayList的寫操作性能較差,而多線程的讀操作性能較好。而Collections.synchronizedList的寫操作性能比CopyOnWriteArrayList在多線程操作的情況下要好很多,而讀操作因為是采用了synchronized關鍵字的方式,其讀操作性能并不如CopyOnWriteArrayList。因此在不同的應用場景下,應該選擇不同的多線程安全實現類。
(5)、為什么get和set LinkedList會比ArrayList慢,add和remove 又更快
-
ArrayList 是一種可增長的數組的實現。
使用ArrayList的優點在于 對 get和set的調用是花費常數時間。缺點就是有新的項插入,和現有的項刪除代價昂貴,除非變動是
在ArrayList的末端進行。 -
使用LinkedList的優點在于新的項的插入和現有的項的刪除開銷很小。這意味著在表的前端進行添加和刪除都是常數時間的操作,因此LinkedList提供了addFirst,removeFirst,addLast,removeLast,以及getFirst和getLast等都有效的添加刪除和訪問。缺點就在于它不容易作索引的,所以get的調用是昂貴的,除非非常接近表的兩端。
(6)、HashMap ,HashTable 區別
-
HashMap和Hashtable都實現了Map接口,但決定用哪一個之前先要弄清楚它們之間的分別。主要的區別有:線程安全性,同步(synchronization),以及速度。
-
HashMap幾乎可以等價于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)。
-
HashMap是非synchronized,而Hashtable是synchronized,這意味著Hashtable是線程安全的,多個線程可以共享一個Hashtable;而如果沒有正確的同步的話,多個線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。
-
另一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當有其它線程改變了HashMap的結構(增加或者移除元素),將會拋出ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這并不是一個一定發生的行為,要看JVM。這條同樣也是Enumeration和Iterator的區別。
-
由于Hashtable是線程安全的也是synchronized,所以在單線程環境下它比HashMap要慢。如果你不需要同步,只需要單一線程,那么使用HashMap性能要好過Hashtable。
-
HashMap不能保證隨著時間的推移Map中的元素次序是不變的。
(7)、Hashtable的優點和缺點。升級版CurrentHashMap。二者的區別。
-
這里直接推薦博主發現的一篇寶藏博客,我也是看了這篇博客后才更深入理解了幾個Map的區別的,大家可以參考下
- 》》博客傳送門《《
(8)、講一下 HashMap 中 put 方法過程?
- 這塊建議大家去詳細讀下HashMap的源碼,一切就會茅廁頓開了!手動滑稽~~~~
(9)、ArrayList和LinkedList的區別,各自的適用場景優缺點。
- 區別
- ArrayList底層是用數組實現的,可以認為ArrayList是一個可改變大小的數組。隨著越來越多的元素被添加到ArrayList中,其規模是動態增加的。
- LinkedList底層是通過雙向鏈表實現的, LinkedList和ArrayList相比,增刪的速度較快。但是查詢和修改值的速度較慢。同時,LinkedList還實現了Queue接口,所以他還提供了offer(),
peek(), poll()等方法。
- 使用場景
- LinkedList更適合從中間插入或者刪除(鏈表的特性)。
- ArrayList更適合檢索和在末尾插入或刪除(數組的特性)。
(10)、ArrayList在遍歷的時候是否能刪除元素,需要注意些什么
- 遍歷的時候可以刪除元素,但是要注意手動修改一下循環變量(減1),否則會導致中間的某些元素錯誤地跳過,遍歷不到。刪除一個元素(n)之后,后邊的元素會自動前移,此時第n+1個元素會移動到第n的位置,正常循環會跳過這個元素,所以就需要對下標做-1的操作了。
- 用迭代器迭代的時候可以刪除元素,但是只能通過迭代器來刪除,不能直接在數組上刪除,否則迭代器會拋出異常。
- 如果有多個迭代器同時迭代的話不能刪除,否則其他迭代器同樣會拋出異常
3、其他基礎問題(必備基礎)
(1)、transient關鍵字的作用
- 對象只要實現了Serilizable接口,這個對象就可以被序列化,java的這種序列化模式為開發者提供了很多便利,我們可以不必關系具體序列化的過程,只要這個類實現了Serilizable接口,這個類的所有屬性和方法都會自動序列化。
- 然而在實際開發過程中,我們常常會遇到這樣的問題,這個類的有些屬性需要序列化,而其他屬性不需要被序列化,打個比方,如果一個用戶有一些敏感信息(如密碼,銀行卡號等),為了安全起見,不希望在網絡操作(主要涉及到序列化操作,本地序列化緩存也適用)中被傳輸,這些信息對應的變量就可以加上transient關鍵字。換句話說,這個字段的生命周期僅存于調用者的內存中而不會寫到磁盤里持久化。
- 總之,java 的transient關鍵字為我們提供了便利,你只需要實現Serilizable接口,將不需要序列化的屬性前添加關鍵字transient,序列化對象的時候,這個屬性就不會序列化到指定的目的地中。
(2)、對象序列化操作
(3)、hashCode和equals方法的關系
- equals相等,hashcode必相等;hashcode相等,equals可能不相等。
(4)、equals和 == 的區別
(5)、Object包含有哪些方法
(6)、垃圾回收機制,如何進行JVM調優。
(7)、如何避免循環依賴
(8)、Lock和Synchronized的區別。
(9)、TCP三次握手四次揮手(必背題)。
(10)、描述一下Http協議從請求到響應的整個過程。
(11)、http和https的區別。
4、數據庫基礎
(1)、事務的四大特性,詳細介紹并舉例
(2)、你們用的事務隔離級別是什么
(3)、#和$的區別
(4)、B+樹和B樹的區別。
(5)、你知道的數據庫引擎有哪幾個,InnerDB數據庫的查詢原理。
(6)、分頁查詢、每頁占多大。
(7)、索引的使用、索引機制,最左原理。
(8)、inner join、left join、right join的區別。
5、Redis—非關系型數據庫
(1)、你所用的過期機制
(2)、什么是緩存擊穿、緩存穿透、緩存雪崩。如何避免?
(3)、Redis存儲的類型有哪些。
(4)、什么是Redis持久化?Redis有哪幾種持久化方式?優缺點是什么?
(5)、redis集群了解么,說說你的理解。
6、Linux相關基礎和指令
(1)、常用的指令有哪些
(2)、sysctrl指令
(3)、tomcat初始內存,如何調整
(4)、Linux如何查看系統日志、用什么指令。
7、框架:
(1)、說說Spring有哪些優點,解決了哪些問題。
(2)、DI和IOC
(3)、描述一下MVC的運行機制和原理
(4)、Spring常用注解,舉一些
(5)、SpringBoot和SpringMVC的區別
(6)、SpringBoot的關鍵注解是哪個,里面主要包含了哪些東西。
8、前端技術
- 由于博主簡歷上還寫了了解前端和安卓,有的也問到了前端或者安卓的一些問題,也只小公司會比較喜歡全棧的吧
(1)、vue的生命周期
(2)、v-if和v-show的區別
(3)、vue構造器是什么,有哪幾個常用掛載點
-
這里再分享一下博主之前寫的一篇基礎面試題。有重復的濾過。
-
》》》傳送門《《《
-
答案太多了先發這點吧,等我有時間再來繼續完善!哈哈,不是我懶,最近快過年了,提前祝大家新年快樂。
9、最后
-
博主也遇到過好幾個,要求現場手撕代碼的。當然都是稍大一點的公司。有的也會直接安排一輪筆試。有的會讓寫表結構、根據需求寫代碼、或者直接是算法題。所以不僅理論要扎實,還是要會寫代碼!在這兒也沒啥可推薦的,還是建議去牛客網刷一下題。
-
加油吧,打工人。只有努力提升自己的實力。我又違背了我去年違約時候說過的話了。我還沒成為大牛、我也不夠努力 !哎~~~~~~~~
-
最后想說的: 希望大家都能找到心儀的工作,應屆生真的千萬千萬不要去小公司、初創公司。真的無論眼界、接觸到的東西、學到的東西、真的很有限很有限。舉個簡單的例子接觸不到高并發的用戶、就接觸不到性能的瓶頸、更別提對于性能的調優。包括很多情況下的開發工作都沒有那么規范、身邊缺少優秀的人、缺少可以學習的人。但是去了大的公司、大的平臺這些都會有。我也是最近在找工作多次碰壁以后、才深深發現了自己的不足何所欠缺的東西。希望后來者不要走我的老路。當然我也是被迫的~~哎!
-
寫的有點多,如有錯誤望指正!
總結
以上是生活随笔為你收集整理的2020Java面试题汇总(2020年负重前行的Java码畜社招遇到的Java面试题---亲历总结)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 周期和频率
- 下一篇: B1HTML5期末大作业:动漫网站设计—