本文回答了 你應(yīng)該知道的JAVA面試題 基礎(chǔ)篇震桶。
http://ifeve.com/java-interview-question/
Java線(xiàn)程的狀態(tài)
答: 線(xiàn)程間的狀態(tài)轉(zhuǎn)換:
(1). 新建(new):新創(chuàng)建了一個(gè)線(xiàn)程對(duì)象。
(2). 可運(yùn)行(runnable):線(xiàn)程對(duì)象創(chuàng)建后,其他線(xiàn)程(比如main線(xiàn)程)調(diào)用了該對(duì)象的start()方法。該狀態(tài)的線(xiàn)程位于可運(yùn)行線(xiàn)程池中治力,等待被線(xiàn)程調(diào)度選中亥至,獲取cpu 的使用權(quán) 。
(3). 運(yùn)行(running):可運(yùn)行狀態(tài)(runnable)的線(xiàn)程獲得了cpu 時(shí)間片(timeslice) 嘲叔,執(zhí)行程序代碼。
(4). 阻塞(block):阻塞狀態(tài)是指線(xiàn)程因?yàn)槟撤N原因放棄了cpu 使用權(quán)抽活,也即讓出了cpu timeslice硫戈,暫時(shí)停止運(yùn)行。直到線(xiàn)程進(jìn)入可運(yùn)行(runnable)狀態(tài)下硕,才有機(jī)會(huì)再次獲得cpu timeslice 轉(zhuǎn)到運(yùn)行(running)狀態(tài)丁逝。
阻塞的情況分三種:
(一). 等待阻塞:運(yùn)行(running)的線(xiàn)程執(zhí)行o.wait()方法,JVM會(huì)把該線(xiàn)程放入等待隊(duì)列(waitting queue)中梭姓。
(二). 同步阻塞:運(yùn)行(running)的線(xiàn)程在獲取對(duì)象的同步鎖時(shí)霜幼,若該同步鎖被別的線(xiàn)程占用,則JVM會(huì)把該線(xiàn)程放入鎖池(lock pool)中誉尖。
(三). 其他阻塞:運(yùn)行(running)的線(xiàn)程執(zhí)行Thread.sleep(long ms)或t.join()方法罪既,或者發(fā)出了I/O請(qǐng)求時(shí),JVM會(huì)把該線(xiàn)程置為阻塞狀態(tài)铡恕。當(dāng)sleep()狀態(tài)超時(shí)琢感、join()等待線(xiàn)程終止或者超時(shí)、或者I/O處理完畢時(shí)探熔,線(xiàn)程重新轉(zhuǎn)入可運(yùn)行(runnable)狀態(tài)驹针。
(5). 死亡(dead):線(xiàn)程run()、main() 方法執(zhí)行結(jié)束诀艰,或者因異常退出了run()方法柬甥,則該線(xiàn)程結(jié)束生命周期。死亡的線(xiàn)程不可再次復(fù)生其垄。進(jìn)程和線(xiàn)程的區(qū)別苛蒲,進(jìn)程間如何通訊,線(xiàn)程間如何通訊
答: 進(jìn)程與線(xiàn)程區(qū)別
定義方面:進(jìn)程是程序在某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng)捉捅;線(xiàn)程是進(jìn)程中的一個(gè)執(zhí)行路徑撤防。
角色方面:在支持線(xiàn)程機(jī)制的系統(tǒng)中,進(jìn)程是系統(tǒng)資源分配的單位,線(xiàn)程是CPU調(diào)度的單位寄月。
資源共享方面:進(jìn)程之間不能共享資源辜膝,而線(xiàn)程共享所在進(jìn)程的地址空間和其它資源。同時(shí)線(xiàn)程還有自己的棧和棧指針漾肮,程序計(jì)數(shù)器等寄存器厂抖。
獨(dú)立性方面:進(jìn)程有自己獨(dú)立的地址空間,而線(xiàn)程沒(méi)有克懊,線(xiàn)程必須依賴(lài)于進(jìn)程而存在忱辅。
開(kāi)銷(xiāo)方面。進(jìn)程切換的開(kāi)銷(xiāo)較大谭溉。線(xiàn)程相對(duì)較小墙懂。(前面也提到過(guò),引入線(xiàn)程也出于了開(kāi)銷(xiāo)的考慮扮念。)
(一)损搬、進(jìn)程間的通信方式
管道( pipe ):管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng)柜与,而且只能在具有親緣關(guān)系的進(jìn)程間使用巧勤。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。
有名管道 (namedpipe) : 有名管道也是半雙工的通信方式弄匕,但是它允許無(wú)親緣關(guān)系進(jìn)程間的通信颅悉。
信號(hào)量(semophore ) : 信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來(lái)控制多個(gè)進(jìn)程對(duì)共享資源的訪(fǎng)問(wèn)迁匠。它常作為一種鎖機(jī)制剩瓶,防止某進(jìn)程正在訪(fǎng)問(wèn)共享資源時(shí),其他進(jìn)程也訪(fǎng)問(wèn)該資源城丧。因此儒搭,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線(xiàn)程之間的同步手段。
消息隊(duì)列( messagequeue ) : 消息隊(duì)列是由消息的鏈表芙贫,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。消息隊(duì)列克服了信號(hào)傳遞信息少傍药、管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)磺平。
信號(hào) (sinal ) : 信號(hào)是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生拐辽。
共享內(nèi)存(shared memory ) :共享內(nèi)存就是映射一段能被其他進(jìn)程所訪(fǎng)問(wèn)的內(nèi)存拣挪,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪(fǎng)問(wèn)俱诸。共享內(nèi)存是最快的 IPC 方式菠劝,它是針對(duì)其他進(jìn)程間通信方式運(yùn)行效率低而專(zhuān)門(mén)設(shè)計(jì)的。它往往與其他通信機(jī)制睁搭,如信號(hào)兩赶诊,配合使用笼平,來(lái)實(shí)現(xiàn)進(jìn)程間的同步和通信。
套接字(socket ) : 套解口也是一種進(jìn)程間通信機(jī)制舔痪,與其他通信機(jī)制不同的是寓调,它可用于不同及其間的進(jìn)程通信。
(二)锄码、線(xiàn)程間的通信方式
鎖機(jī)制:包括互斥鎖夺英、條件變量、讀寫(xiě)鎖
互斥鎖提供了以排他方式防止數(shù)據(jù)結(jié)構(gòu)被并發(fā)修改的方法滋捶。讀寫(xiě)鎖允許多個(gè)線(xiàn)程同時(shí)讀共享數(shù)據(jù)痛悯,而對(duì)寫(xiě)操作是互斥的。條件變量可以以原子的方式阻塞進(jìn)程重窟,直到某個(gè)特定條件為真為止载萌。對(duì)條件的測(cè)試是在互斥鎖的保護(hù)下進(jìn)行的。條件變量始終與互斥鎖一起使用亲族。
信號(hào)量機(jī)制(Semaphore):包括無(wú)名線(xiàn)程信號(hào)量和命名線(xiàn)程信號(hào)量
信號(hào)機(jī)制(Signal):類(lèi)似進(jìn)程間的信號(hào)處理
線(xiàn)程間的通信目的主要是用于線(xiàn)程同步炒考,所以線(xiàn)程沒(méi)有像進(jìn)程通信中的用于數(shù)據(jù)交換的通信機(jī)制。
3.HashMap的數(shù)據(jù)結(jié)構(gòu)是什么霎迫?如何實(shí)現(xiàn)的斋枢。和HashTable,ConcurrentHashMap的區(qū)別
答:數(shù)組+鏈表+紅黑樹(shù)知给。具體可以參見(jiàn)以下文章瓤帚。
http://www.reibang.com/p/c0642afe03e0
4.Cookie和Session的區(qū)別
答: 簡(jiǎn)單說(shuō)就是HTTP協(xié)議是無(wú)狀態(tài)的,服務(wù)器端需要session來(lái)跟蹤用戶(hù)的狀態(tài)涩赢。
Session是在服務(wù)端保存的一個(gè)數(shù)據(jù)結(jié)構(gòu)戈次,用來(lái)跟蹤用戶(hù)的狀態(tài),這個(gè)數(shù)據(jù)可以保存在集群筒扒、數(shù)據(jù)庫(kù)怯邪、文件中;Cookie是客戶(hù)端保存用戶(hù)信息的一種機(jī)制花墩,用來(lái)記錄用戶(hù)的一些信息悬秉,也是實(shí)現(xiàn)Session的一種方式。
http://www.reibang.com/p/a2fe1d6441a7
- 索引有什么用冰蘑?如何建索引和泌?
答: http://blog.csdn.net/evankaka/article/details/46685649
6.ArrayList是如何實(shí)現(xiàn)的,ArrayList和LinkedList的區(qū)別祠肥?ArrayList如何實(shí)現(xiàn)擴(kuò)容武氓。
答: ArrayList 的本質(zhì)就是數(shù)組, ArrayList就是對(duì)數(shù)組進(jìn)行動(dòng)態(tài)的擴(kuò)展,其add, get , remove 等等操作就是對(duì)數(shù)組的操作县恕。每次擴(kuò)容到原來(lái)大小的1.5倍东羹。
7.equals方法實(shí)現(xiàn)
答:當(dāng)equals重載時(shí),這里有4個(gè)會(huì)引發(fā)equals行為不一致的常見(jiàn)陷阱:
定義了錯(cuò)誤的equals方法簽名(signature) Defining equals with the wrong signature.
重載了equals的但沒(méi)有同時(shí)重載hashCode的方法弱睦。 Changing equals without also changing hashCode.
建立在會(huì)變化字域上的equals定義百姓。 Defining equals in terms of mutable fields.
不滿(mǎn)足等價(jià)關(guān)系的equals錯(cuò)誤定義 Failing to define equals as an equivalence relation.
酷殼有篇文章專(zhuān)門(mén)講解equals方法。https://coolshell.cn/articles/1051.html
8.面向?qū)ο?br>
答:這個(gè)題目很寬泛况木,可以談?wù)劮庋b垒拢,繼承,多態(tài)火惊,SOLID原則求类。Java需要了解接口和抽象類(lèi)的區(qū)別。
9.線(xiàn)程狀態(tài)屹耐,BLOCKED和WAITING有什么區(qū)別
答:
假設(shè)t1尸疆,t2先后兩個(gè)線(xiàn)程,都執(zhí)行如下代碼:
synchronized(Obj) {
Obj.wait();
}
t1先進(jìn)惶岭,最后在Obj.wait()下卡住寿弱,這時(shí)java管t1的狀態(tài)waitting狀態(tài)
t2后進(jìn),直接在第一行就卡住了按灶,這時(shí)java叫t2為blocked狀態(tài)症革。
判斷是否是BLOCKED可以看該線(xiàn)程是否在等待獲取鎖,WAITING從官方文檔中可以知道調(diào)用Object.wait(), Thread.join(), LockSupport.park()會(huì)使得線(xiàn)程進(jìn)入該狀態(tài)。
10.JVM如何加載字節(jié)碼文件
答:JVM的功能可以歸納為:
加載:通過(guò)類(lèi)加載器加載類(lèi)文件的過(guò)程鸯旁。
鏈接:鏈接類(lèi)文件噪矛,提交給JVM在運(yùn)行時(shí)執(zhí)行。
初始化:分配內(nèi)存和調(diào)用類(lèi)初始化方法設(shè)置變量值铺罢。
你可能還需要了解JVM的架構(gòu)圖艇挨,方法區(qū),堆空間韭赘,椝醣酰空間,Native Memory.
http://www.reibang.com/p/f4f580289091
- JVM GC泉瞻,GC算法楷怒。
答:這個(gè)網(wǎng)上資料很多,主要了解CMS的 Eden瓦灶、Survivor 和 Tenured/Old 空間。
G1算法的優(yōu)點(diǎn)抱完,和CMS垃圾收集的區(qū)別贼陶。
12.什么情況會(huì)出現(xiàn)Full GC,什么情況會(huì)出現(xiàn)young GC。
答: young GC清理Eden區(qū)的內(nèi)存碉怔。FullGC 清理所有內(nèi)存烘贴。Major GC 清理老年代。
Initial Mark 和 Remark會(huì)stop the world.
需要注意的是G1 GC正常情況是避免Full GC的撮胧,如果G1算法出現(xiàn)了Full GC桨踪,意味著系統(tǒng)出現(xiàn)了問(wèn)題,要進(jìn)行調(diào)優(yōu)芹啥。
G1 GC正常情況下只有young GC 和 mixed GC(Eden和Old區(qū)同時(shí)GC)锻离。
13.JVM內(nèi)存模型
答:
http://ifeve.com/java-memory-model-6/
如果能夠看懂這篇文章,對(duì)內(nèi)存使用和理解會(huì)更上一層樓墓怀。https://www.ibm.com/developerworks/cn/java/j-nativememory-linux/
14.Java運(yùn)行時(shí)數(shù)據(jù)區(qū)
答:見(jiàn)上圖汽纠,但是要注意的是在JDK1.8之后,方法區(qū)(PermGen)已經(jīng)去除傀履,相關(guān)的內(nèi)容被移到了元數(shù)據(jù)區(qū)虱朵。
http://www.infoq.com/cn/articles/Java-PERMGEN-Removed
http://www.reibang.com/p/6173a467165e
15.事務(wù)的實(shí)現(xiàn)原理
答: https://my.oschina.net/huangyong/blog/160012
https://my.oschina.net/huangyong/blog/1598521.