終于熬過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方法,然后進行呼叫,
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i<10; i++){
System.out.println("mythread執行緒正在執行:"+new Date().getTime());
}
}
}
//呼叫
MyThread thread = new MyThread();//沒有傳入引數
thread.start();
- b、實作Runable介面
public class MyRunable implements Runnable {
public void run() {
for (int i=0; i<10; i++){
System.out.println("MyRunnable執行緒正在執行:"+new Date().getTime());
}
}
}
//呼叫
Thread thread = new Thread(new MyRunable());//注意傳入引數
thread.start();
- c、實作Callable介面
public class MyCallable implements Callable<String> {//注意泛型,傳入的型別就是call方法的回傳值型別
public String call() throws Exception {
for (int i=0; i<10; i++){
System.out.println("MyCallable正在執行:"+new Date().getTime());
}
return "MyCallable執行完畢!";
}
}
//呼叫
FutureTask task = new FutureTask(new MyCallable());//注意需要創建FutureTask物件,傳入Callable介面實作類的物件
Thread thread = new Thread(task);//傳入FutureTask物件
thread.start();
- d、執行緒池創建(后面在細節講各個引數)
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
}
(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、最后
-
博主也遇到過好幾個,要求現場手撕代碼的,當然都是稍大一點的公司,有的也會直接安排一輪筆試,有的會讓寫表結構、根據需求寫代碼、或者直接是演算法題,所以不僅理論要扎實,還是要會寫代碼!在這兒也沒啥可推薦的,還是建議去牛客網刷一下題,
-
加油吧,打工人,只有努力提升自己的實力,我又違背了我去年違約時候說過的話了,我還沒成為大牛、我也不夠努力 !哎~~~~~~~~
-
最后想說的: 希望大家都能找到心儀的作業,應屆生真的千萬千萬不要去小公司、初創公司,真的無論眼界、接觸到的東西、學到的東西、真的很有限很有限,舉個簡單的例子接觸不到高并發的用戶、就接觸不到性能的瓶頸、更別提對于性能的調優,包括很多情況下的開發作業都沒有那么規范、身邊缺少優秀的人、缺少可以學習的人,但是去了大的公司、大的平臺這些都會有,我也是最近在找作業多次碰壁以后、才深深發現了自己的不足何所欠缺的東西,希望后來者不要走我的老路,當然我也是被迫的~~哎!
-
寫的有點多,如有錯誤望指正!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/257751.html
標籤:其他
下一篇:你們要的微信紅包封面來了
