01:項(xiàng)目介紹
此乃面試之時(shí)第一環(huán)節(jié),主要考察你的概述能力和對(duì)業(yè)務(wù)的熟悉程度,
對(duì)需求的分析能力,溝通協(xié)作能力,產(chǎn)品思維能力,抽象建模能力等。
02:Java基礎(chǔ)
1、List 和 Set 的區(qū)別?
List和Set都是實(shí)現(xiàn)了collection接口的。
LIst:
可以允許重復(fù)對(duì)象。
可以插入多個(gè)null元素。
是一個(gè)有序的容器保證的每個(gè)元素的插入順序,輸出的順序就是插入的順序。
常用的實(shí)現(xiàn)類(lèi)有ArrayList和LinkedList和Vector。
ArrayList和Vector底層是采用數(shù)組的方式存儲(chǔ)數(shù)據(jù),可以使用索引(數(shù)組的下標(biāo))來(lái)訪問(wèn)list中的元素,所以插入數(shù)據(jù)慢,查找可以根據(jù)下標(biāo)查詢,較快。Vector是線程安全的。LinkedList底層是雙向鏈表實(shí)現(xiàn)存儲(chǔ),按照序號(hào)索引需要向前或者向后遍歷,插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)前后即可,插入和刪除較快。
在多線程并發(fā)的時(shí)候ArrayList和LinkedList是非線程安全的,并且是不同步的,Vector所有的方法都用了synchronized方法,是線程安全的。
set:
不允許重復(fù)對(duì)象。
只允許一個(gè)null元素。
是一個(gè)無(wú)序容器,無(wú)法保證每個(gè)元素的插入順序
常用的實(shí)現(xiàn)類(lèi)有HashSet,LinkedHashSet和TreeSet。
2、HashSet 是如何保證不重復(fù)的
是靠元素重寫(xiě)hashcode()和equals()方法來(lái)保證。
添加元素時(shí)調(diào)用HashSet類(lèi)中的add()方法,
public boolean add(E e){
return map.put(e,PRESENT)==null;
}
HashSet類(lèi)中put()方法:
1:在for循環(huán)中首先遍歷table中的元素
如果hash碼值不相同,說(shuō)明是一個(gè)新的元素,就保存。
如果hash碼值相同,且equles判斷相等,說(shuō)明元素已經(jīng)存在,不保存。
如果hash碼值相同,且eques判斷不相等,說(shuō)明元素不存在,保存。
3、HashMap 是線程安全的嗎,為什么不是線程安全的?
HashMap是非線程安全的,多線程情況下不推薦使用HashMap,
4、HashMap 的擴(kuò)容過(guò)程?
5、HashMap 1.7 與 1.8 的 區(qū)別,說(shuō)明 1.8 做了哪些優(yōu)化,如何優(yōu)化的
6、final finally finalize?
final:Java中的關(guān)鍵字,修飾符。如果一個(gè)類(lèi)被聲明為final,那么就不能派生出新的子類(lèi)。因此一個(gè)類(lèi)不能同時(shí)被申請(qǐng)為final和abstract。
如果將變量和方法聲明為final,那么他們?cè)谑褂眠^(guò)程中就不會(huì)被改變
聲明為final的變量必須在聲明的時(shí)候給定初始值,在以后的引用中只能讀取,不能修改。
不可改變的只是這個(gè)變量所保存的引用,并不是這個(gè)引用所指向的對(duì)象。
聲明為fanl的方法,只能使用,不能重載。
finally:Java異常處理的補(bǔ)充,不管有沒(méi)有異常發(fā)生finally塊中的代碼中會(huì)執(zhí)行。
finalize:Java中的一個(gè)方法名,使用finalize()方法在垃圾收集器將對(duì)象從內(nèi)存中清理出去的時(shí)候,做必要的清理工作。這個(gè)方法是在垃圾收集器確定這個(gè)對(duì)象沒(méi)有被引用的時(shí)候?qū)@個(gè)對(duì)象的調(diào)用,他是在Object類(lèi)中定義的,因此所有的類(lèi)都繼承了他。
7、強(qiáng)引用 、軟引用、 弱引用、虛引用?
8、Java反射?
在運(yùn)行狀態(tài)中,對(duì)于任何一個(gè)類(lèi)都能知道這個(gè)類(lèi)的所有屬性和方法,
對(duì)于任何一個(gè)對(duì)象,都能夠調(diào)用他的任意方法和屬性,并且能改變他的屬性。
9.多線程實(shí)現(xiàn)
java 中提供了三種創(chuàng)建線程的方法,
1,通過(guò)實(shí)現(xiàn)Runnable接口,創(chuàng)建一個(gè)實(shí)現(xiàn)Runnable接口的實(shí)現(xiàn)類(lèi),重寫(xiě)run()方法,可以在類(lèi)中實(shí)例化線程對(duì)象。
2,通過(guò)繼承Thread類(lèi),新建類(lèi)繼承Thread類(lèi),創(chuàng)建該類(lèi)的實(shí)例,重寫(xiě)run()方法,調(diào)用start()方法執(zhí)行。
3,通過(guò)Callable和Futere創(chuàng)建線程
01. 創(chuàng)建 Callable 接口的實(shí)現(xiàn)類(lèi),并實(shí)現(xiàn) call() 方法,該 call() 方法將作為線程執(zhí)行體,并且有返回值。
02. 創(chuàng)建 Callable 實(shí)現(xiàn)類(lèi)的實(shí)例,使用 FutureTask 類(lèi)來(lái)包裝 Callable 對(duì)象,該 FutureTask 對(duì)象封裝了該 Callable 對(duì)象的 call() 方法的返回值。
03. 使用 FutureTask 對(duì)象作為 Thread 對(duì)象的 target 創(chuàng)建并啟動(dòng)新線程。
04. 調(diào)用 FutureTask 對(duì)象的 get() 方法來(lái)獲得子線程執(zhí)行結(jié)束后的返回值。
03:Java并發(fā)
1、synchronized 的實(shí)現(xiàn)原理以及鎖優(yōu)化
Java中每一個(gè)對(duì)象都可以作為鎖,這是實(shí)現(xiàn)synchronized同步的基礎(chǔ)。
普通同步方法,鎖是當(dāng)前實(shí)例對(duì)象。
靜態(tài)同步方法,鎖是當(dāng)前類(lèi)的class對(duì)象。
同步方法塊,鎖是括號(hào)里面的對(duì)象。
當(dāng)一個(gè)線程訪問(wèn)同步代碼塊時(shí),它首先需要得到鎖才能執(zhí)行同步代碼,當(dāng)退出或者跑出異常時(shí)必須釋放鎖。
2、volatile 的實(shí)現(xiàn)原理
3、Java 的信號(hào)
4、synchronized 在靜態(tài)方法和普通方法的區(qū)別
5、怎么實(shí)現(xiàn)所有線程在等待某個(gè)事件的發(fā)生才會(huì)去執(zhí)行
6、CAS,CAS 有什么缺陷,如何解決
7、synchronized 和 lock 有什么區(qū)別
8、Hashtable 是怎么加鎖的?
9、HashMap 的并發(fā)問(wèn)題
10、ConcurrenHashMap 介紹,1.8 中為什么要用紅黑樹(shù)
11、AQS?
12、如何檢測(cè)死鎖,怎么預(yù)防死鎖
13、Java 內(nèi)存模型
14、如何保證多線程下 i++ 結(jié)果正確
15、線程池的種類(lèi),區(qū)別和使用場(chǎng)景
Java通過(guò)Executors提供四種線程池,分別為:
newCachedThreadPool創(chuàng)建一個(gè)可緩存線程池,如果線程池長(zhǎng)度超過(guò)處理需要,可靈活回收空閑線程,若無(wú)可回收,則新建線程。
newFixedThreadPool 創(chuàng)建一個(gè)定長(zhǎng)線程池,可控制線程最大并發(fā)數(shù),超出的線程會(huì)在隊(duì)列中等待。
newScheduledThreadPool 創(chuàng)建一個(gè)定長(zhǎng)線程池,支持定時(shí)及周期性任務(wù)執(zhí)行。
newSingleThreadExecutor 創(chuàng)建一個(gè)單線程化的線程池,它只會(huì)用唯一的工作線程來(lái)執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行。
16、分析線程池的實(shí)現(xiàn)原理和線程的調(diào)度過(guò)程
17、線程池如何調(diào)優(yōu),最大數(shù)目如何確認(rèn)
18、ThreadLocal原理,用的時(shí)候需要注意什么
04:Spring
1、BeanFactory 和 FactoryBean
BeanFactory是接口,提供了IOC容器的最基本形式,給具體的IOC容器的實(shí)現(xiàn)提供了規(guī)范。負(fù)責(zé)生產(chǎn)和管理bean的一個(gè)工廠,BeanFactory是IOC容器的核心接口,作用是:實(shí)例化,定位,配置應(yīng)用程序中的對(duì)象及建立這些對(duì)象的依賴。他只是個(gè)接口,并不是IOC容器的具體實(shí)現(xiàn)。
FactoryBean是一個(gè)bean,不同于普通Bean的是:是一個(gè)能生產(chǎn)或者修飾對(duì)象生成的工廠Bean,它是實(shí)現(xiàn)了FactoryBean<T>接口的Bean,根據(jù)該Bean的ID從BeanFactory中獲取的實(shí)際上是FactoryBean的getObject()返回的對(duì)象,而不是FactoryBean本身,如果要獲取FactoryBean對(duì)象,請(qǐng)?jiān)趇d前面加一個(gè)&符號(hào)來(lái)獲取。
2、Spring IOC 的理解,其初始化過(guò)程
3、BeanFactory 和 ApplicationContext
4、Spring Bean 的生命周期,如何被管理的
5、Spring Bean 的加載過(guò)程是怎樣的
6、如果要你實(shí)現(xiàn)Spring AOP,請(qǐng)問(wèn)怎么實(shí)現(xiàn)
7、如果要你實(shí)現(xiàn)Spring IOC,你會(huì)注意哪些問(wèn)題
8、Spring 是如何管理事務(wù)的,事務(wù)管理機(jī)制
9、Spring 的不同事務(wù)傳播行為有哪些,干什么用的
10、Spring 中用到了那些設(shè)計(jì)模式
04:數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)事物的四大特性:原子性,一致性,永久性,隔離性。
原子性:所有的數(shù)據(jù)庫(kù)操作要么全部成功,要么全部失敗回滾,
一致性:數(shù)據(jù)庫(kù)操作必須是從一個(gè)一致性狀態(tài)變換到另一個(gè)一致性狀態(tài),執(zhí)行前和執(zhí)行后都必須保持一致性。
永久性:一個(gè)事物如果被提交了,那么他對(duì)數(shù)據(jù)庫(kù)的改變就是永久的,在系統(tǒng)遇到故障的時(shí)候也不會(huì)丟失事物的操作。
隔離性:多個(gè)用戶訪問(wèn)數(shù)據(jù)庫(kù)時(shí),數(shù)據(jù)庫(kù)為每一個(gè)用戶開(kāi)啟的事物不能被其他事物所干擾,多個(gè)事物 并發(fā)之間要相互隔離。
05:分布式
1、Dubbo的底層實(shí)現(xiàn)原理和機(jī)制?
2、描述一個(gè)服務(wù)從發(fā)布到被消費(fèi)的詳細(xì)過(guò)程?
3、分布式系統(tǒng)怎么做服務(wù)治理?
4、接口的冪等性的概念?
5、消息中間件如何解決消息丟失問(wèn)題?
6、Dubbo的服務(wù)請(qǐng)求失敗怎么處理?
7、重連機(jī)制會(huì)不會(huì)造成錯(cuò)誤?
8、對(duì)分布式事務(wù)的理解?
9、如何實(shí)現(xiàn)負(fù)載均衡,有哪些算法可以實(shí)現(xiàn)
10、Zookeeper的用途,選舉的原理是什么
11、數(shù)據(jù)的垂直拆分水平拆分。?
12、zookeeper原理和適用場(chǎng)景?
13、zookeeper watch機(jī)制?
14、redis/zk節(jié)點(diǎn)宕機(jī)如何處理?
15、分布式集群下如何做到唯一序列號(hào)?
16、如何做一個(gè)分布式鎖?
06:緩存
1、Redis用過(guò)哪些數(shù)據(jù)類(lèi)型,以及Redis底層怎么實(shí)現(xiàn)?
String(字符串) :key? value的形式 ,是二進(jìn)制安全的,可以包含任何數(shù)據(jù)。例如序列化的對(duì)象或者圖片。賦值命令:set? 取值命令:get
hash(哈希):
?list(列表) :
set(無(wú)序不重復(fù)集合):
zset(有序不重復(fù)集合):
2、Redis緩存穿透,緩存雪崩?
3、如何使用Redis來(lái)實(shí)現(xiàn)分布式鎖
4、Redis的并發(fā)競(jìng)爭(zhēng)問(wèn)題如何解決?
5、Redis持久化的幾種方式,優(yōu)缺點(diǎn)是什么,怎么實(shí)現(xiàn)的?
6、Redis的緩存失效策略?
7、Redis集群,高可用,原理?
8、Redis緩存分片?
9、Redis的數(shù)據(jù)淘汰策略
07:JVM
1、詳細(xì)jvm內(nèi)存模型?
2、講講什么情況下回出現(xiàn)內(nèi)存溢出,內(nèi)存泄漏
3、說(shuō)說(shuō)Java線程棧?
4、JVM 年輕代到年老代的晉升過(guò)程的判斷條件是什么呢
5、JVM 出現(xiàn) fullGC 很頻繁,怎么去線上排查問(wèn)題
6、類(lèi)加載為什么要使用雙親委派模式,有沒(méi)有什么場(chǎng)景是打破了這個(gè)模式
7、類(lèi)的實(shí)例化順序?
父類(lèi)靜態(tài)成員和靜態(tài)初始化塊-------》子類(lèi)靜態(tài)成員和靜態(tài)初始化塊------》父類(lèi)實(shí)例成員和實(shí)例初始化塊-----》父類(lèi)構(gòu)造方法-------》子類(lèi)實(shí)例成員和實(shí)例初始化塊----------》子類(lèi)構(gòu)造方法
對(duì)象初始化的順序:先靜態(tài)方法在構(gòu)造方法,先父類(lèi)在子類(lèi)。