1冰抢、String、StringBuffer和StringBuilder的區(qū)別
String
是不可變對象,每次對其操作都等同于生成一個(gè)新的String
對象单鹿,每次操作后指針指向新的對象馏予,當(dāng)內(nèi)存中存在較多無用的對象后天梧,GC
就會開始工作,導(dǎo)致速度很慢霞丧,而StringBuffer
和StringBuilder
每次操作都是對自己本身進(jìn)行操作呢岗,兩個(gè)都是利用緩沖區(qū),這樣提升了速度蛹尝,但是StringBuffer
是線程安全的后豫,而StringBuilder
是非線程安全的,速度會快一些突那。創(chuàng)建String
對象時(shí)一般是會先在字符串常量區(qū)創(chuàng)建一個(gè)對象然后賦值挫酿,這里在類加載的時(shí)候是涉及到兩個(gè)對象,但是在程序執(zhí)行過程中是創(chuàng)建了一個(gè)對象愕难。
2早龟、GC的概念。循環(huán)引用的對象能否被回收猫缭?
GC
就是JVM
中的內(nèi)存進(jìn)行標(biāo)記葱弟,判斷哪些內(nèi)存需要回收,根據(jù)一定的回收策略自動回收相關(guān)內(nèi)存猜丹,防止出現(xiàn)內(nèi)存泄漏的情況芝加。循環(huán)應(yīng)用的對象也是可以被回收的,因?yàn)?code>GC回收對象不僅僅考慮對象是否被引用射窒,還要看對象是否被至少一個(gè)GC roots
對象直接或間接引用藏杖。這里GC roots
有:
a.每個(gè)線程當(dāng)前的函數(shù)調(diào)用棧将塑,從棧頂?shù)綏5椎拿總€(gè)函數(shù)里的局部變量
b.靜態(tài)變量
c.被JNI
引用的變量
3、Java中的內(nèi)存溢出是如何造成的制市?
(1)首先要知道Java
中的內(nèi)存是如何管理的:在Java
程序中抬旺,我們通常使用new
為對象分配內(nèi)存,而這些內(nèi)存空間都在堆(Heap
)上祥楣。java
中對象之間的引用關(guān)系像一條鏈子开财,每分配一個(gè)新的對象,堆指針就會向后移動误褪,當(dāng)移動到內(nèi)存的最終地址责鳍,內(nèi)存就耗盡了,此時(shí)GC
就會參與進(jìn)來回收不再使用的內(nèi)存兽间,當(dāng)然回收的策略有很多历葛。
(2)java
內(nèi)存泄漏其實(shí)就是不再被使用的對象的內(nèi)存不能被回收。比如一個(gè)類中維護(hù)了一個(gè)對象實(shí)例嘀略,而我們希望這個(gè)實(shí)例只作用于某個(gè)方法中恤溶,但是當(dāng)這個(gè)方法運(yùn)行完了之后此對象占用的內(nèi)存是不會被釋放的,只有在類創(chuàng)建的實(shí)例對象被釋放后此對象才能被釋放帜羊,嚴(yán)格來說這就是一種內(nèi)存泄漏咒程,解決方法就是將類中維護(hù)的實(shí)例放到方法中去維護(hù),這樣當(dāng)方法執(zhí)行完后此實(shí)例也會被釋放讼育。
(3)一般解決內(nèi)存泄漏的方法就是盡量減小對象的作用域帐姻,對象不用后設(shè)置為null
,還有各類close
方法奶段。如數(shù)據(jù)庫連接饥瓷、網(wǎng)絡(luò)連接、IO
連接痹籍,單例也會造成內(nèi)存泄漏呢铆,可以使用同步解決。
4词裤、高并發(fā)下線程安全的單例模式
一般單例模式有餓漢式與懶漢式刺洒,但是在多線程中極易出現(xiàn)線程沖突,解決方法有很多吼砂,如對單例模式進(jìn)行同步,推薦的方式是雙檢查鎖機(jī)制鼎文,其實(shí)就是首先判斷是否不為空渔肩,不為空直接獲取拇惋;否則就需要同步周偎,同步之后再加一個(gè)判空來實(shí)現(xiàn)抹剩。當(dāng)然還有維護(hù)靜態(tài)實(shí)例(static
和枚舉都行)等方式。
5蓉坎、異常機(jī)制
異常有很多澳眷,如文件找不到、網(wǎng)絡(luò)連接失敗等蛉艾。異常Throwable
分為Exception
異常和Error
錯(cuò)誤钳踊。Erro
是程序自己無法處理的,而Exception
是程序本身可以處理的異常勿侯。Exception
又分為IO
異常和RuntimeException
異常拓瞪。而總的來說,異常分為可檢查的異常助琐,編譯器要求必須處理祭埂;不可檢查異常就是Error
和運(yùn)行時(shí)異常。運(yùn)行時(shí)異常都是RuntimeException
的子類兵钮。異常處理一般可以捕獲和拋出蛆橡,常見的運(yùn)行時(shí)異常如NullPointerException UnknowTypeException、ClassNotFoundException
等掘譬。
6泰演、HashMap中的key。
在jdk8
中key
是可以為null
的屁药,但是不是所有對象都能作為key
粥血,比如可變對象,當(dāng)使用可變對象作為key
的時(shí)候很容易造成數(shù)據(jù)丟失酿箭,一般如果要將可變對象作為key
复亏,一定要保證在修改其中的某些字段的時(shí)候保證其hashcode
值不變。
7缭嫡、守護(hù)線程分為用戶守護(hù)線程和Daemon守護(hù)線程缔御。
只要當(dāng)前JVM
中存在任何一個(gè)非守護(hù)線程沒有結(jié)束,那么守護(hù)線程就工作妇蛀,守護(hù)線程最典型的應(yīng)用就是GC
耕突。我們可以自己設(shè)置守護(hù)線程,但是必須在線程運(yùn)行之前评架,我們不能將一個(gè)正在運(yùn)行的線程設(shè)置為守護(hù)線程眷茁。
8、對SQL進(jìn)行優(yōu)化的原則
(1)使用索引來更快地遍歷表
(2)不能用null
作索引
(3)EXISTS
要遠(yuǎn)比IN
的效率高
(4)在海量查詢時(shí)盡量少用格式轉(zhuǎn)換
(5)循環(huán)中不要使用變量
9纵诞、數(shù)據(jù)庫存儲引擎上祈,存儲數(shù)據(jù)結(jié)構(gòu)
ISAM讀取操作快,占用資源少,但是不支持事務(wù)和容錯(cuò)登刺;
MYISAM使用表格索引機(jī)制籽腕,來優(yōu)化多個(gè)并發(fā)的讀寫操作
INNODB支持對事務(wù)的處理,支持外來鍵
10纸俭、樂觀鎖皇耗、悲觀鎖
悲觀鎖大多數(shù)情況下依靠數(shù)據(jù)庫的鎖機(jī)制實(shí)現(xiàn),以保證操作最大程度的獨(dú)占性揍很,但這使得數(shù)據(jù)庫開銷太大郎楼,特別是長事物。樂觀鎖大多是基于數(shù)據(jù)庫版本記錄機(jī)制實(shí)現(xiàn)的女轿,即為數(shù)據(jù)增加一個(gè)版本標(biāo)識箭启,讀取數(shù)據(jù)時(shí)將版本號一同讀出,對此版本號加一蛉迹,然后當(dāng)前版本數(shù)據(jù)進(jìn)行對比傅寡,如果版本號大于當(dāng)前的版本號,則更新北救,否則認(rèn)為是過期數(shù)據(jù)荐操。
java中的悲觀鎖和數(shù)據(jù)庫中的悲觀鎖類似,而樂觀鎖是假設(shè)完成某項(xiàng)操作不會產(chǎn)生沖突珍策,當(dāng)在完成過程中發(fā)生沖突則重試托启,直到成功為止。
11攘宙、Mybatis的工作原理
查看筆記中內(nèi)容屯耸。
12、IO(BIO)與NIO蹭劈、AIO(NIO2)的區(qū)別疗绣,阻塞與非阻塞的區(qū)別
IO是同步阻塞式,就是每次只能為一個(gè)請求服務(wù)铺韧,每個(gè)請求在處理過程中會阻塞其他請求多矮,當(dāng)并發(fā)量較高時(shí)不可用,于是有了偽異步IO哈打,這是用線程池來解決的塔逃。當(dāng)某個(gè)請求沒有得到響應(yīng),則會一直阻塞料仗。
NIO是同步非阻塞式湾盗。使用全雙工通道Channel和多路復(fù)用器Selector實(shí)現(xiàn),可以同時(shí)進(jìn)行讀寫操作立轧,Selector會不斷輪詢注冊在其上 通道淹仑,如果哪個(gè)通道準(zhǔn)備好了就為其服務(wù)丙挽。
AIO是異步非阻塞式肺孵,AIO提供了異步通道匀借,并提供了異步文件通道和異步套接字的實(shí)現(xiàn),異步套接字時(shí)真正的異步非阻塞IO平窘。這種IO的讀寫都是異步的吓肋。
13、海量數(shù)據(jù)分析
14瑰艘、多線程
Hibernate一級和二級緩存是鬼,其他緩存,事物傳播行為種類紫新,如何實(shí)現(xiàn)申明式事務(wù)
restful的好處均蜜,有幾種請求,表單如何提交put請求
web中安全問題的考慮如何防止芒率,web系統(tǒng)整體架構(gòu)
一囤耳、
1、hashmap偶芍、concurrenthashmap的底層實(shí)現(xiàn)和區(qū)別充择;
2、spring框架的原理
3匪蟀、如何寫一個(gè)orm框架
4椎麦、hibernate一級和二級緩存,其他緩存
5材彪、hibernate事務(wù)傳播行為種類
6观挎、springmvc原理
7、restful的好處
8段化、restful有幾種請求嘁捷,表單如何提交put請求
9、web中安全問題的考慮穗泵,如何防止
10普气、web系統(tǒng)整體架構(gòu)
11、hibernate如何實(shí)現(xiàn)聲明式事務(wù)
12佃延、java并發(fā)包
13现诀、volatile
14、spring底層數(shù)據(jù) 結(jié)構(gòu)
15履肃、如何進(jìn)行反射仔沿,如何提高反射的性能
16、如何實(shí)現(xiàn)java的代理尺棋,為什么需要實(shí)現(xiàn)接口
18封锉、三次握手
19、springmvc有哪些注解
二、
1成福、什么是restful web service
2碾局、并發(fā)集合
3、項(xiàng)目中使用的數(shù)據(jù)結(jié)構(gòu)
4奴艾、TCP中斷連接四次揮手
5净当、http和https
6、知道哪些鎖
7蕴潦、JVM內(nèi)存
8像啼、springcloud相關(guān)