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