1、Java基礎java
1. 實例方法和靜態方法有什麼不同?node
2. Java中的異常有哪幾類?分別怎麼使用?mysql
檢出異常,非檢出異常。檢出異常須要try...catch才能編譯經過。非檢出異常不用try...catch也能編譯經過。ios
RuntimeException是非檢出異常,不須要try...catch也能編譯經過。web
IoException,SQLException等等其餘全部異常都是檢出異常,必需要try...catach才能編譯經過。redis
3. 經常使用的集合類有哪些?好比List如何排序?算法
分兩種,一種實現Set接口,一種是實現List接口的。spring
Set:TreeSet,HashSet.sql
List:ArrayList,LinkedList,Vector(線程安全)。shell
JDK7之前用collections.sort(list,Comparator).
JDK8直接用List.sort(Comparator).
4. ArrayList和LinkedList內部的實現大體是怎樣的?他們之間的區別和各自適應的場景是什麼?
ArrayList,是數組結構:少用與中間的增刪。多用於查詢,修改。每次增刪元素順序都會操做每一個元素。
LinkedList,是鏈表結構:多用於中間,開頭增刪。少用查詢,修改。查詢時會遍歷大量元素。
5. 內存溢出是怎麼回事?
對象有被指向的引用,可是再也用不到它就是內存溢出了。
GC機制:複製回收,標記清除,引用計數(若是有循環引用後,會影響垃圾回收,因此JVM虛擬機沒有采用此方法進行垃圾回收)。
6. ClassLoader有什麼用?
類加載器:全部類都須要Classloader來加載。
BoostrapClassLoader,加載系統(java包下)的類,SystemClassLoader,加載系統擴展類(少用),AppClassloader應用類加載器,還有針對每一個項目的類加載器。
7. ==和equals的區別?
==判斷對象物理地址。
equals判斷對象Value是否相等。
8. hashCode方法的做用?
在hashMap中使用,把一個對象變成一個整型。hashCode規範,若是兩個對象的equals返回true,那他們的hashCode必須相等,可是hashCode相等,不必定equals不必定相等。
9. Object類中有哪些方法?列舉3個以上。
構造方法,toString(),equals,hashCode,getClass,finalize,clone,三個wait(),notify,notifyAll.
10. NIO是什麼?適用於何種場景?
NIO是newIO,接口都是異步的,非阻塞的。
12. HashMap數據結構、擴展策略,Hash衝突攻擊如何防範,如何實現線程安全的HashMap?
JDK7之前:數組裏面存linkedList,hash衝突,升級到JDK8。
JDK8,數組裏面加集合,若是對象hashCode相同,不可比較時就是linkedList,可比較就會用TreeSet進行排序處理(紅黑樹先訪問小的)。hash衝突不用防範。若是對象不可比較且hash衝突,咱們可適當實現可比較接口。
線程安全:ConcurrentHashMap(系統自帶的線程安全的HashMap),Map<Object, Object> synchronizedMap = Collections.synchronizedMap(new HashMap<>()); synchronizedMap 爲線程安全的Map.
13. JVM內存結構,GC算法,CMS、G1的原理
14. NIO模型,select/epoll的區別,多路複用的原理
16. Java中一個字符佔多少個字節,擴展再問int, long, double佔多少字節
一個字符兩個字節,int 4 , long double 8
17. 建立一個類的實例都有哪些辦法?
new ,反射。
18. final/finally/finalize的區別?
final是類,變量,方法的修飾。類被修飾後不能再被繼承。變量和方法被修飾不能再被修改
finally是try...catch後執行的finally,
finalize,在Object中的方法名,在此對象被回收前會執行這個方法。(當使用文件流時,若是對象被回收,沒有關閉流,在底層就會實現內存泄露)
19. LinkingBlockingQueue與ArrayBlockingQueue的區別,他們的適用場景?
LinkingBlockQueue 鏈表實現的阻塞隊列,適合一個一個放,一個一個取。
ArrayBlocakingQueue數組實現的阻塞隊列,適合三個放,多個放,只適合多個取,不適合單個取。
20. Session/Cookie的區別?
Session存在服務器端。
Cookie存在客戶端(瀏覽器上)。
21. String/StringBuffer/StringBuilder的區別,擴展再問他們的實現?
String 值不可變
StringBuffer 值可變,線程安全
StringBuilder 值可變,線程不安全
22. Servlet的生命週期?
初始化,服務處理(接收請求,處理請求,返回結果),銷燬。
23. 如何用Java分配一段連續的1G的內存空間?須要注意些什麼?
ByteBuffer.allocateDirect(1024*1024*1024);
24. Java有本身的內存回收機制,但爲何還存在內存泄露的問題呢?
25. Java裏面用對象做爲Key須要注意些什麼? 如何實現hashcode?
對象放進去了hash值不能變。hashCode的值儘可能不等。
2、JVM
1. JVM堆的基本結構。
2. JVM的垃圾算法有哪幾種?CMS收集算法的流程?
3. JVM有哪些經常使用啓動參數能夠調整?
4. 如何查看JVM的內存使用狀況?
5. Java程序是否會內存溢出?
6. 你經常使用的JVM配置和調優參數都有哪些?分別什麼做用?
7. Java內存分代模型,GC算法,JVM常見的啓動參數;
8. CMS算法的過程,CMS回收過程當中JVM是否須要暫停(這塊回答較好,也能夠只是看畢玄的Java分佈式開發或網上文章的學習, 能夠結合JVM啓動參數常見配置,jstat等命令,看下動手能力,意願;以及實際線上問題排查)
9. 什麼狀況下會出現OOM(堆內存,永久區,堆外區,方法棧)
10. Java內存結構(堆結構,新生代[S0/S1/Elden],年老代,持久代)
11. 經常使用的GC策略,何時會觸發YGC,何時觸發FGC
3、數據結構與算法基礎
1. 說一下幾種常見的排序算法和分別的複雜度。
2. 什麼是跳錶?
3. 如何確認一個鏈表有環?進一步,確認環的位置。
4. 如何遍歷一棵二叉樹?
5. 倒排一個LinkedList。
6. HashSet的實現方式
4、多線程/併發
1. Java中常見的鎖
互斥鎖,讀寫鎖,信號量
互斥鎖,讀寫只能一個線程
讀寫鎖,寫只能一個線程,讀能夠多個線程
信號量,如停車場,能容許必定量的線程,滿了則不能再進入,須要等別的線程釋放資源。
2. 原子Atomic類,如何保證原子性,CAS硬件指令
在atomic類底層使用CAS硬件指令,來保證atomic的原子性。CAS在硬件級別實現了原子操做。
3. volatile,可見性問題的緣由,硬件架構,L3 Cache,QPI,樂觀鎖
volatile:易變的。被修飾的變量在多線程中被改變時,別的線程能知道。
4. 如何實現一個線程安全的數據結構
new 一個volatile 的Atomatic變量,或者使用concurrent類型的集合,ConcurrentHashMap之類的。
5. 如何避免死鎖
若是有兩個鎖的時候,若是先鎖住第一個參數,再鎖住第二個參數,這種狀況就會產生死鎖。
好比,第一個參數是A,第二個參數是B,若是第一個參數先鎖,第二個參數後鎖。在恰好鎖住第一個參數,第二次請求來了,恰好兩個參數顛倒了就會鎖住第二個參數,那就會形成死鎖。
解決死鎖:在須要鎖住多個參數的時候,先把參數按固定的順序排序,而後在對排序後的參數加鎖,這樣就有效的避免死鎖。
6. 如何解決ABA問題
ABA問題:若是另外一個線程修改V值假設原來是A,先修改爲B,再修改回成A。當前線程的CAS操做沒法分辨當前V值是否發生過變化。
用另外一個標識判斷某值是否有改變過。
7. Synchronized關鍵字的做用?
對Synchronized()括號內的對象加互斥鎖,不影響父類或者子類的訪問。
8. Volatile關鍵字的做用?
可見的,當其中一個線程改變了volatile的變量時,別的使用這個變量的線程都能讀取到最新值。
可是,這個並不能解決併發問題。好比第一個線程讀取到值是3,第二個線程也讀取了3,而後第一個線程+1放入了write區,第二個線程+1也放到了write區,那麼兩個線程的值都是4,指望值是5,這時候仍是會形成併發問題。
9. Java內存模型是怎樣的?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
1
. 方法區:
a. 方法區是各線程共享內存的區域。
b. 它存放類的信息、
static
變量、常量(常量池包含於方法區)、即時編譯器編譯後的代碼數據。
c. 它屬於非堆部分。
2
. 堆(先進先出):
a. 堆是內存最大的一塊區域,堆是各線程共享內存的區域。
b. 堆中存放被建立的實例對象、數組。
c. 堆是GC管理的主要區域。
3
. 棧(先進後出):
a. 棧是線程私有的,它的生命週期與線程相同。線程生命週期(建立,就緒,運行,阻塞,死亡)
b. 棧是java方法執行的內存模型:
每一個方法執行時會在棧中建立一個棧幀(stack frame),用於存放 局部變量表、操做棧、動態連接、方法出口等信息。方法從執行開始就完成了 壓棧 到 彈棧 的過程。
局部變量表中存放了基本數據類型(
int
,
short
,
long
,
char
,
byte
,
float
,
double
,
boolean
,其中
long
、
double
兩個
64
位長度的類型會佔用兩個局部變量空間、其餘的只佔一個)、對象引用(並不是自己,引用指向堆中的對象地址)、方法返回類型。
局部變量表所需控件在編譯時就已經肯定了,所以方法運行期間不會改變其內存大小。
4
. 本地方法棧:
a. 與java虛擬機棧功能相似,區別在於服務對象不一樣,該棧服務於jvm使用的
native
方法。
5
. 程序計數器:
a. 每條線程執行時都有本身的程序計數器,互不影響。
b. 程序計數器指向該計數器的擁有者(線程)下一步執行的位置。
|
10. HashMap在多線程環境下使用須要注意什麼?爲何?
在多線程環境下,須要使用ConcurrentHashMap,由於HashMap是線程不安全的,若是多線程操做,會形成不可預期的結果。
11. Java程序中啓動一個線程是用run()仍是start()?
start()是從新開啓一個線程運行。 若是是run(),那就至關於在當前線程運行,並不會新建立一個線程運行。
12. 什麼是守護線程?有什麼用?
守護線程是運行在後端的線程,當系統中止運行,守護線程也就中止了。
進行內存回收,垃圾清理等工做
13. 什麼是死鎖?如何避免
緣由:
(1) 由於系統資源不足。
(2) 進程運行推動的順序不合適。
(3) 資源分配不當等。
死鎖必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已得到的資源保持不放。
(3) 不剝奪條件:進程已得到的資源,在末使用完以前,不能強行剝奪。
(4) 循環等待條件:若干進程之間造成一種頭尾相接的循環等待資源關係。
A線程鎖住的資源被B線程鎖住了,而後B線程須要的資源被A線程鎖住了,這時候就會形成死鎖。
避免這種死鎖的方法,當須要鎖住多個資源的時候,那就先對資源進行排序,而後再加鎖,就會有效的防止死鎖。
還有飢餓鎖,當優先級高的不斷得到資源,優先級低的一直獲取不到資源,也會形成死鎖。
謙讓鎖,當幾個線程共同獲取資源,就會線程先中止,讓別的線程先執行。若是每一個線程都這樣,那就會一塊兒謙讓,也會形成死鎖。
14. 線程和進程的差異是什麼?
線程是進程的實現,進程是線程的體現。進程是獨立的,線程運行在進程內。進程內能夠有多個線程同時運行着。
線程是在代碼層面上,進程是在服務器CPU內存上。
15. Java裏面的Threadlocal是怎樣實現的?
16. ConcurrentHashMap的實現原理是?
對大數組的每一個值進行分離加鎖,實現了鎖分離。
17. sleep和wait區別
sleep是佔用着cpu阻塞,wait是不佔用cpu阻塞。
18. notify和notifyAll區別
通知處在等待該對象的線程
notifyAll使全部原來在該對象上等待被notify的線程通通退出wait的狀態,變成等待該對象上的鎖,一旦該對象被解鎖,他們就會去競爭。
notify是通知其中一個線程,而不會通知別的線程。
19. volatile關鍵字的做用
20. ThreadLocal的做用與實現
21. 兩個線程如何串行執行
22. 上下文切換是什麼含義
23. 能夠運行時kill掉一個線程嗎?
24. 什麼是條件鎖、讀寫鎖、自旋鎖、可重入鎖?
25. 什麼是協程(用戶態線程,減小數據拷貝,下降CPU開銷,無callback函數)?
26. 線程池ThreadPoolExecutor的實現原理?
27. J.U.C下的常見類的使用。lock, synchronized, ThreadPool的深刻考察; BlockingQueue的使用。(take,poll的區別,put,offer的區別);原子類的實現。
28. 各類常見鎖使用若是上面這些掌握很好,還能夠看看更深一點的 False Sharing,Cache Line,可見性與原子性等;
5、Linux使用與問題分析排查
1. 硬連接和軟連接的區別?
2. inode是什麼?
3. Linux經常使用命令有哪些?
4. 怎麼看一個Java線程的資源耗用?
5. Load太高的可能性有哪些?
6. /etc/hosts文件什麼作用?
7. /etc/resolv.conf文件什麼做用?
8. 如何快速的將一個文本中全部「abc」替換爲「xyz」?
9. 你經常使用的Linux下用來進行網絡和磁盤IO分析的工具備哪些?
10. 你經常使用的Linux下用來進行內存和CPU分析的工具備哪些?
11. 發現磁盤空間不夠,如何快速找出佔用空間最大的文件?
12. Java服務端問題排查(OOM,CPU高,Load高,類衝突)
13. Java經常使用問題排查工具及用法(top, iostat, vmstat, sar, tcpdump, jvisualvm, jmap, jconsole)
14. Thread dump文件如何分析(Runnable,鎖,代碼棧,操做系統線程ID關聯)
15. grep,awk,sed; 是否本身寫過shell腳本;
16. 常見的cpu load太高,us太高,通常是什麼問題。引伸出是否用過top,jstat,jstack等。
17. 常見的內存問題通常有哪些。 引伸出是否用過free,top, jmap等。
6、框架使用
1. Spring中Bean的生命週期。
2. SpringMVC或Struts處理請求的流程。
3. Spring AOP解決了什麼問題?怎麼實現的?aop與cglib,與asm的關係。
4. Spring事務的傳播屬性是怎麼回事?它會影響什麼?
5. Spring中BeanFactory和FactoryBean有什麼區別?
6. Spring框架中IOC的原理是什麼?
7. spring的依賴注入有哪幾種方式
8. struts工做流程
9. 用Spring如何實現一個切面?
10. Spring 如何實現數據庫事務?
11. Hibernate和Ibatis這類ORM框架的區別?什麼是ORM,解決的痛點是什麼?
12. spriong ioc的生命週期,(init-method,intilizingbean接口方法afterPropertiesSet的前後順序)等。
13. Hibernate對一二級緩存的使用,Lazy-Load的理解;
14. Spring IoC AOP本身用代碼如何實現
15. RPC的負載均衡、服務發現怎麼作的
16. 幾種推送模型的區別,long polling,websocket
7、數據庫相關
1. MySQL InnoDB的特色?
2. 樂觀鎖和悲觀鎖的區別?
3. 數據庫隔離級別是什麼?有什麼做用?
4. MySQL主備同步的基本原理。
5. 如何從一張表中查出name字段包含「XYZ」的全部行?
6. 索引數據結構(字典+BitTree)
7. 如何優化數據庫性能(索引、分庫分表、批量操做、分頁算法、升級硬盤SSD、業務優化、主從部署)
8. SQL什麼狀況下不會使用索引(不包含,不等於,函數)
9. 通常在什麼字段上建索引(過濾數據最多的字段)
10. 如何從一張表中查出name字段不包含「XYZ」的全部行?
11. MySQL,B+索引實現,行鎖實現,SQL優化
12. Redis,RDB和AOF,如何作高可用、集羣
13. 如何解決高併發減庫存問題
14. mysql存儲引擎中索引的實現機制;
15. 數據庫事務的幾種粒度;
16. 行鎖,表鎖;樂觀鎖,悲觀鎖
8、網絡協議和網絡編程
1. TCP創建鏈接的過程。
2. TCP斷開鏈接的過程。
3. 瀏覽器發生302跳轉背後的邏輯?
4. HTTP協議的交互流程。HTTP和HTTPS的差別,SSL的交互流程?
5. Rest和Http什麼關係? 你們都說Rest很輕量,你對Rest風格如何理解?
6. TCP的滑動窗口協議有什麼用?講講原理。
7. HTTP協議都有哪些方法?
8. 交換機和路由器的區別?
9. 什麼是VLAN,有什麼做用?
10. 什麼是VXLAN,有什麼做用?
11. http協議(報文結構,斷點續傳,多線程下載,什麼是長鏈接)
12. tcp協議(建連過程,慢啓動,滑動窗口,七層模型)
13. webservice協議(wsdl/soap格式,與rest協議的區別)
14. spdy/http2.0協議是否有了解
15. NIO的好處,Netty線程模型,什麼是零拷貝
9、Redis等緩存系統/中間件/NoSQL/一致性Hash等
1. 列舉一個經常使用的Redis客戶端的併發模型。
2. HBase如何實現模糊查詢?
3. 列舉一個經常使用的消息中間件,若是消息要保序如何實現?
4. 如何實現一個Hashtable?你的設計如何考慮Hash衝突?如何優化?
5. 分佈式緩存,一致性hash
6. LRU算法,slab分配,如何減小內存碎片
7. 如何解決緩存單機熱點問題
8. 什麼是布隆過濾器,其實現原理是? False positive指的是?
9. memcache與redis的區別
10. zookeeper有什麼功能,選舉算法如何進行
11. map/reduce過程,如何用map/reduce實現兩個數據源的聯合統計
10、設計模式與重構
1. 你在設計一個工廠的包的時候會遵循哪些原則?
2. 你能列舉一個使用了Visitor/Decorator模式的開源項目/庫嗎?
3. 你在編碼時最經常使用的設計模式有哪些?在什麼場景下用?
4. 如何實現一個單例?
5. 代理模式(動態代理)
6. 單例模式(懶漢模式,惡漢模式,併發初始化如何解決,volatile與lock的使用)
7. JDK源碼裏面都有些什麼讓你印象深入的設計模式使用,舉例看看?
8. Reactor模式
11、學習與進取心
1. 平時會關注哪些技術?
2. 會看那些技術博客和網站?
3. 技術上有沒有偶像?
4. 看過哪些技術書籍?
5. 你日常都看些什麼書?你去年和今年看的書中印象最深的基本技術書籍和非技術書籍是?
6. (若是不看書)你日常都上哪些技術論壇?最喜歡哪一個?爲何?
7. 項目或產品中用到了什麼新技術或框架
8. 最近研究過什麼業界流行的技術或框架
9. 對如今所作的項目或產品的缺陷是否瞭解,有何規劃
10. 是否有帶過項目,如何管理項目
11. 是否有帶過團隊,團隊管理最大的挑戰點是什麼
12、抗壓能力及抗壓意願
1. 剛纔你說的XXX實現跟那個開源的YYY很像,是否是抄來的?
2. 對加班怎麼看?
3. 平臺是否有加班,是主動仍是被動,是否很是抗拒
4. 是否有負責多件事情,多件事情如何並行處理
5. 你對你最近負責項目中最自豪的點是什麼?
十3、穩定性考察
1. 瞭解家庭婚姻情況, 瞭解購房及居住地,籍貫狀況,瞭解目前薪資,評估穩定性
2. 若是讓你接手一個歷史悠久的模塊,你會怎麼作?
3. 看簡歷跳槽狀況,針對性發問,如跳槽頻繁的話問清楚爲何
十4、開放性問題
1. 一個大文件4G,裏面一行行的數字,這時內存只有256M,若是作排序?
2. 若是你部署的應用所在機器硬盤壞了,會發生什麼?你的程序要如何處理這種異常?(分佈式系統中故障是一種常態,設計要避免單點故障,能容錯,保證系統高可用)
3. 實現一個消息隊列系統
4. 如何設計一個高可用的架構
5. 屢次Hash來解決URL重複訪問問題。
6. 全局惟一ID問題。
7. 秒殺如何設計。
8. 如何進行性能優化。
9. 發現CPU 100%,如何排查?
10. 實現一個分佈式打點系統。
11. taobao.com和tmall.com的互相登陸的問題。
12. 如何快速對一個2億數據的List進行排序?