技術體系(面試)上牛客網
待整理:https://blog.csdn.net/qq_34337272/article/details/79805764
https://www.nowcoder.com/discuss/5941
面試網站及書籍:牛客網牛客網 劍指offer 深入理解JVM虛擬機 編程之美, JAVA併發編程實戰,牛客網可找內推,
注意:理解原理,深入深入,發散深入
提示:很多時候,面試官都是順着一條線一路問下去的,如果你覺得這條線你不熟悉的話,就要及時拐彎,引導面試官去問其 它方面的問題。千萬不要一直往下深入,直到自己跳不出來爲止,那就尷了個尬了。
一般都根據項目來問,然後發散
Java基礎:
重載與重寫的區別?
說下AtomicInteger的原理
說下HIVE,自己就說了些hive將sql映射成mapreduce任務等
講講HBase,自己說了下它包括哪些部分,以及怎麼存貯等。
講講Hadoop,自己主要說了HDFS以及mapreduce,還是拿經典的wordcount舉例子。
Java源碼:HashMap源碼,ArrayList源碼(ArrayList源碼可以扯一扯ArrayList在序列化上的優化,然後扯一扯序列化,還可以順 便扯一扯網絡編程)
Java數據結構:(https://blog.csdn.net/kangbin825/article/details/68957482)
HashMap是否線程安全,什麼是線程安全的。自己說了下ConcurrentHashMap,談了些它的分段鎖提高併發等。
①TreeMap與HashMap區別?實現原理?
②List的實現原理?
③ArrayList初始化的默認長度?ArrayList的長度是固定的嗎?其實現的原理是什麼?java自動增加ArrayList大小的思路是? -作者答:向ArrayList添加對象時,原對象數目加1如果大於原底層數組的長度,則以適當長度新建一個原數組的拷貝, 並修改原數組,指向這個新建數組。原數組自動拋棄(java垃圾回收機制自動回收)。size則在向數組添加對象,自增 1。
例子:1)Java的數據結構相關的類實現原理,比如LinkedList,ArrayList,HashMap,TreeMap這一類的。以下簡單模擬 一個數據結構的連環炮。
比如,面試官先問你HashMap是不是有序的?
你肯定回答說,不是有序的。那面試官就會繼續問你,有沒有有順序的Map實現類?
你如果這個時候說不知道的話,那這個問題就到此結束了。如果你說有TreeMap和LinkedHashMap。
那麼面試官接下來就可能會問你,TreeMap和LinkedHashMap是如何保證它的順序的?
如果你回答不上來,那麼到此爲止。如果你依然回答上來了,那麼面試官還會繼續問你,你覺得它們兩個哪個的有序實現 比較好?
如果你依然可以回答的話,那麼面試官會繼續問你,你覺得還有沒有比它更好或者更高效的實現方式?
如果你還能說出來的話,那麼就你所說的實現方式肯定依然可以問你很多問題。
線程:
線程--創建方式,線程池,多線程,生命週期,併發,單例(懶漢惡漢),多線程下保證懶漢的同步性及其優化,synchronized及 volatile關鍵字,單例+雙重鎖定,
如何讓兩個單獨的異步線程順序執行,ThreadPoolexector的重要參數
鎖: 基礎:死鎖,同步鎖,可重入鎖,讀寫鎖, 深入:wait和sleep,wait和await,concurrent包
ReentrantLock和synchronized的區別,瞭解synchronized的實現原理嗎?
多線程與併發相關知識! 多線程與併發相關知識!! 多線程與併發相關知識!!!
例子:
2)Java併發包當中的類,它們都有哪些作用,以及它們的實現原理,這些類就是java.concurrent包下面的。與上面一 樣,咱們也簡單的模擬一個併發包的連環炮。
比如面試官可能會先問你,如果想實現所有的線程一起等待某個事件的發生,當某個事件發生時,所有線程一起開始 往下執行的話,有什麼好的辦法嗎?
這個時候你可能會說可以用柵欄(Java的併發包中的CyclicBarrier),那麼面試官就會繼續問你,你知道它的實現原 理嗎?
如果你繼續回答的話,面試官可能會繼續問你,你還知道其它的實現方式嗎?
如果你還能說出很多種實現方式的話,那麼繼續問你,你覺得這些方式裏哪個方式更好?
如果你說出來某一個方式比較好的話,面試官依然可以繼續問你,那如果讓你來寫的話,你覺得還有比它更好的實現 方式嗎?
如果你這個時候依然可以說出來你自己更好的實現方式,那麼面試官肯定還會揪着這個繼續問你。
爲什麼說面試的時候要引導面試官,原因就在這了。因爲面試官的提問很多時候都是有跡可循的,你如果抓住了他的 軌跡,能夠猜到他下面很可能會問什麼,那你在回答的時候就可以往你想要談的方向去說。這樣面試時就會顯得更加 從容,更加的遊刃有餘。
Spring+SpringMVC: 原理流程,各種註解;
Spring中最主要的特性,講了下IOC跟AOP的個人理解
AOP編程的常用實現方式。cglib瞭解麼?
Spring源碼看過麼?聊一聊你印象最深的地方。
Spring 框架:配置文件、IoC 思想、DI 依賴注入、面向切面編程、事務等。
SpringMVC:框架原理、交互、攔截器等。
反射: +類加載,雙親委派,osgi,jigsaw
java反射中,Class.forName和classloader的區別(代碼說話)
https://blog.csdn.net/qq_27093465/article/details/52262340 https://www.jb51.net/article/113928.htm
IO流:
例子:
3)IO包和NIO包中的內容。這部分裏面NIO會是重點,IO包大部分都會比較熟悉,因此可能會直接略過,直接問你NIO 的內容。
IO包和NIO包的內容相對來說不是很多,首先NIO模型要熟悉,特別是其中的selector一定要非常清楚它的職責和實現原 理。其實NIO的核心是IO線程池,一定要記住這個關鍵點。有的時候,面試官可能也會問你IO包的設計模式(裝飾器模 式),爲什麼要這樣設計?
有的面試官還會問你有沒有更好的設計,這個時候如果你不知道請果斷說自己現在的水平有限,想不出來更好的設計, 千萬不要信口開河,隨意YY。
內存及虛擬機:《深入理解JVM虛擬機》
jvm的分區,以及每個分區的作用,談堆區的時候又談到了堆區分爲新生代、老年代跟永久代。然後談了新生代包括Eden區、Survivor區,然後Survivor區分爲From跟To,
以及在Eden區不足時會進行minor GC,然後什麼比較大的對象會直接進入老年代了,以及什麼時候進行Full GC了等等。
例子:
4)Java的虛擬機的內容。這部分主要包括三部分,GC、類加載機制,以及內存。
<1>一個GC部分簡單的連環炮。
面試官可以先問你什麼時候一個對象會被GC?
接着繼續問你爲什麼要在這種時候對象纔會被GC?
接着繼續問你GC策略都有哪些分類?
你如果說出來了,繼續問你這些策略分別都有什麼優劣勢?都適用於什麼場景?
你繼續說出來了以後,給你舉個實際的場景,讓你選擇一個GC策略?
你如果選出來了,繼續問你,爲什麼要選擇這個策略?
<2>下面是關於類加載機制的簡單連環炮。
首先肯定是先問你Java的類加載器都有哪些?(https://blog.csdn.net/u011080472/article/details/51332866)
回答了這些以後,可能會問你每個類加載器都加載哪些類?
說完以後,可能會問你這些類加載之間的父子關係是怎樣的?
你在回答的時候可能會提到雙親委派模型,那麼可以繼續問你什麼是雙親委派模型?
你解釋完了以後,可能會繼續問你,爲什麼Java的類加載器要使用雙親委派模型?
你回答完以後,可能會繼續問你如何自定義自己的類加載器,自己的類加載器和Java自帶的類加載器關係如何處理?
<3>再來一個關於內存的連環炮。
首先肯定就是問你內存分爲哪幾部分,這些部分分別都存儲哪些數據?
然後繼續問你一個對象從創建到銷燬都是怎麼在這些部分裏存活和轉移的?
接着可能會問你,內存的哪些部分會參與GC的回收?
完事以後,可能還會問你Java的內存模型是怎麼設計的?
你回答了以後,還會繼續問你爲什麼要這麼設計?
問完以後,還可能會讓你結合內存模型的設計談談validate關鍵字的作用?
你在談的時候,肯定會提到可見性,那麼接着可見性這三個字,還可以繼續問你併發的內容。
緩存: redis,redis的內部實現機制,hibernte和mybatis等框架的緩存機制等,蘇寧. redis數據庫
反向代理及負載均衡:做過的項目最多支持過多少人同時訪問,負載均衡麼,扯一扯dns負載均衡,圖片服務器,反向代理負載 均衡,負載均衡的算法,之前幾種反向代理的優缺點
通過Nginx+Tomcat+Redis實現反向代理、負載均衡及Session同步
談談nginx 的負載均衡的原理。
模式: 單例模式、簡單工廠模式、工廠模式、抽象工廠模式、策略模式、觀察者模式、組合模式、適配器模式、裝飾模式、代 理模式、外觀模式。
手寫單例 --> 雙檢索(記得有個雙重檢查鎖定 + volatile https://blog.csdn.net/zhangzeyuaaa/article/details/42673245) 。
手寫單例模式,寫了懶漢:
public class Singleton{
private static Singleton sg;
private Singleton(){}
public synchronized static getInstance(){
if(sg==null){
sg = new Singleton();
}
return sg;
}
}
然後面試官提醒這樣多個線程在同時調用getInstance()時都需阻塞着,而我們需要加鎖的僅僅是在創建sg時需加鎖,經面試官多番引導,終於寫出了下面的樣子,面試官告訴我這叫雙檢索。
public class Singleton{
private static Singleton sg;
private Singleton(){}
public static getInstance(){
if(sg==null){
synchronized(Singleton.class){ //只有在新創建單例時纔有必要加鎖
if(sg==null){//雙檢索避免重複創建單例
sg = new Singleton();
}
}
}
return sg;
}
}
分佈式:
給出了一個場景,假設有3臺服務器來處理來到的請求,第一臺服務器可以處理30個請求,第二臺可以處理70個請求,第三 臺理120個請求,如何實現在分配請求的服務器上時時分發請求,提示將三臺服務器的IP作爲key,value中的value。後面 又提示往TreeMap上想,這個沒答好。
數據庫:事務,索引,存儲過程,視圖,分區,約束,引擎,分類,全家桶等等等
索引的優點,畫出索引的結構圖《高性能mysql》
InnoDB中主鍵索引跟二級索引葉子節點的區別,以及myISAM索引,
B+樹的結構,以及這種結構非常適合於磁盤讀寫,可以減少IO次數,從而提高性能等。
數據庫事務,數據庫範式
數據庫隔離模式,對應的髒讀,不可重複讀,幻讀
加載數據庫的過程,什麼什麼會導致sql注入嗎(preparestatement爲什麼不會導致sql注入),hibernate防止sql注入,
數據庫優化 https://www.jb51.net/article/19024.htm
數據結構:棧/堆/隊列/樹/圖 的定義等,什麼是堆,怎麼建堆,各種排序(堆排序,歸併,希爾,冒泡,快速排序(算法複雜度))怎麼實現, 什麼時候使用,如求第k大數等,求第k大數還能用哪些方法,優缺點--by《編程之美》
找第K大元素,說出快排的平均時間複雜度。
找前k大元素,說了還可以使用快排,堆排序也可以。
如何實現索引,b+樹與b樹區別
講下數組跟鏈表的區別及各自的優缺點。既然這兩種結構都有優點及不足,怎樣能充分利用這兩種結構的優點,作者答:HashMap,然後談了些HashMap的原理,提了些java8裏面爲解決拉鍊法造成鏈太長而使用紅黑樹了等等。
<1、二分查找
/**
* Created by HuangQinJian on 2017/2/27.
*/
public class main {
public static int sort(int da[], int a) {
int len = da.length;
int left = 0, right = len - 1;
int mid = 0;
while (left <= right) {
mid = (left + right) / 2;
if (a < da[mid]) {
right = mid - 1;
} else if (a > da[mid]) {
left = mid + 1;
} else {
return mid;
}
}
return -1;
}
public static void main(String[] args) {
int a[] = {1, 2, 6, 87, 456, 899};
int result = sort(a, 899);
System.out.println(result);
}
}
<2 給一個無序數組int[] nums 和一個整數 target,在這個數組中找到兩個數 ,使得這個兩個數的和等於target,找到這個數組中所有的滿足這樣條件的數。
網絡協議:七層四層協議等每一層幹啥的,TCP協議和UDP協議區別,如何用UDP實現TCP; TCP四次握手和三次握手的區別;TCP/IP協議,IP 地址子網劃分。在瀏覽器上敲一個URL,按下回車,發生了什麼?
說下TCP跟HTTP中keepalive的區別。
操作系統:操作系統全家桶(lru,磁盤尋道,死鎖條件)
算法:《編程之美》+《劍指offer》,設計迷宮遊戲的時候怎麼設計生成迷宮的算法,怎麼設計遊戲難度,拼圖遊戲怎麼保證一定有解(n*m分奇偶性討論)
抽獎遊戲(最基本的)
用你能想到的最快方式找到倆條鏈的交點。
給定數組的所有奇數在前,偶數在後,如何翻轉過來。
手寫一個冒泡排序
網絡安全:https,ddos之類的,XSS,CSRF
Linux:各種命令
Tomcat優化:
機試題:華爲:https://blog.csdn.net/fengsigaoju/article/details/65934742
各種排序算法等
性格測試:華爲:http://bbs.tianya.cn/post-516-150970-1.shtml
用過的框架及插件:karaf.camel,docker,k8s,activeMQ,元數據,
要了解的框架及插件:分佈式編程裏的幾個框架,找找看,接口冪等性,分佈式事務鎖(https://blog.csdn.net/lovesomnus/article/details/51785108),
項目:項目中用戶id用的什麼,如何生成--註冊號..
博客:https://blog.csdn.net/kangbin825/article/details/68957482
https://blog.csdn.net/fengsigaoju/article/details/70194632
https://blog.csdn.net/sinat_35512245/article/details/58209966
https://blog.csdn.net/qq_34337272/article/details/79805764
https://blog.csdn.net/weixin_39069037/article/details/79619158
https://www.nowcoder.com/discuss/5941
https://www.nowcoder.com/contestRoom
JAVA6個月實習培訓計劃:https://www.zhihu.com/question/29581524/answer/44872235