java面試常見題目及解答_第1頁
java面試常見題目及解答_第2頁
java面試常見題目及解答_第3頁
java面試常見題目及解答_第4頁
java面試常見題目及解答_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、1 什么情況下會(huì)觸發(fā)Minor GC?Minor GC 發(fā)生在新生代的垃圾收集動(dòng)作,當(dāng)Eden區(qū)和survivor區(qū)內(nèi)存不夠的時(shí)候回產(chǎn)生minor gc,當(dāng)出現(xiàn)Major或者是Full GC的時(shí)候往往伴隨著Minor GC的產(chǎn)生。java線程之間的通信JVM如何加載一個(gè)類的過程,雙親委派模型中有哪些方法?類加載的全過程是 :1. 加載加載時(shí)類加載中的一個(gè)階段:包含以下三個(gè)部分通過一個(gè)類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流強(qiáng)這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中生成一個(gè)代表這個(gè)列的java.lang.Class對象,作為方法去這個(gè)類的各種數(shù)據(jù)的訪問入口2. 驗(yàn)證驗(yàn)證

2、是連接的第一步,這一階段的目的是為了確保Class文件的字節(jié)流總包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會(huì)危害虛擬機(jī)自身的安全,這個(gè)階段是否嚴(yán)謹(jǐn),決定了java虛擬機(jī)是否能夠承受惡意代碼的攻擊3. 準(zhǔn)備準(zhǔn)備階段是正式為類變量分配內(nèi)存并設(shè)置類變量初始值的階段,這些變量所使用的內(nèi)存豆?jié){在方法區(qū)中進(jìn)行分配,不包括實(shí)例變量,所有初始化都是0即使是為靜態(tài)變量指定了值,在這個(gè)階段也是04. 解析解析是虛擬機(jī)將常量池內(nèi)的符號(hào)引用替換為直接引用的過程5. 初始化初始化時(shí)類加載過程的最后一步,(3)HashMap如何實(shí)現(xiàn)的?如何實(shí)現(xiàn)線程安全的hashmapMap m = Collections.synchroni

3、zedMap(new HashMap();可以實(shí)現(xiàn)線程安全的hashmap(4)HashMap和Concurrent HashMap區(qū)別, Concurrent HashMap 線程安全嗎, Concurrent HashMap如何保證 線程安全?(5)HashMap和HashTable 區(qū)別,HashTable線程安全嗎?第一個(gè)不同主要是歷史原因。Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn)。 也許最重要的不同是Hashtable的方法是同步的

4、,而HashMap的方法不是。這就意味著,雖然你可以不用采取任何特殊的行為就可以在一個(gè)多線程的應(yīng)用程序中用一個(gè)Hashtable,但你必須同樣地為一個(gè)HashMap提供外同步。一個(gè)方便的方法就是利用Collections類的靜態(tài)的synchronizedMap()方法,它創(chuàng)建一個(gè)線程安全的Map對象,并把它作為一個(gè)封裝的對象來返回。這個(gè)對象的方法可以讓你同步訪問潛在的HashMap。這么做的結(jié)果就是當(dāng)你不需要同步時(shí),你不能切斷Hashtable中的同步(比如在一個(gè)單線程的應(yīng)用程序中),而且同步增加了很多處理費(fèi)用。 第三點(diǎn)不同是,只有HashMap可以讓你將空值作為一個(gè)表的條目的key或valu

5、e。HashMap中只有一條記錄可以是一個(gè)空的key,但任意數(shù)量的條目可以是空的value。這就是說,如果在表中沒有發(fā)現(xiàn)搜索鍵,或者如果發(fā)現(xiàn)了搜索鍵,但它是一個(gè)空的值,那么get()將返回null。如果有必要,用containKey()方法來區(qū)別這兩種情況。(6)進(jìn)程間通信有哪幾種方式?· 管道( pipe ):管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng),而且只能在具有親緣關(guān)系的進(jìn)程間使用。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。· 命名管道 (named pipe) : 命名管道也是半雙工的通信方式,但是它允許無親緣關(guān)系進(jìn)程間的通信。· 信號(hào)量( semophor

6、e ) : 信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來控制多個(gè)進(jìn)程對共享資源的訪問。它常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問共享資源時(shí),其他進(jìn)程也訪問該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。· 消息隊(duì)列( message queue ) : 消息隊(duì)列是由消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。· 信號(hào) ( sinal ) : 信號(hào)是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生。· 共享內(nèi)存( shared memory ) :共享內(nèi)存就是映射一段能被其他進(jìn)

7、程所訪問的內(nèi)存,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪問。共享內(nèi)存是最快的 IPC 方式,它是針對其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的。它往往與其他通信機(jī)制,如信號(hào)量,配合使用,來實(shí)現(xiàn)進(jìn)程間的同步和通信。· 套接字( socket ) : 套解口也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于不同及其間的進(jìn)程通信。(7)JVM分為哪些區(qū),每一個(gè)區(qū)干嗎的?1、程序計(jì)數(shù)器(Program Counter Register)這是一塊比較小的內(nèi)存,不在Ram上,而是直接劃分在CPU上的,程序員無法直接操作它,它的作用是:JVM在解釋字節(jié)碼文件(.class)時(shí),存儲(chǔ)當(dāng)前線

8、程所執(zhí)行的字節(jié)碼的行號(hào),只是一種概念模型,各種JVM所采用的方式不同,字節(jié)碼解釋器工作時(shí),就是通過改變程序計(jì)數(shù)器的值來選取下一條要執(zhí)行的指令,分支、循環(huán)、跳轉(zhuǎn)、等基礎(chǔ)功能都是依賴此技術(shù)區(qū)完成的。還有一種情況,就是我們常說的Java多線程方面的,多線程就是通過現(xiàn)程輪流切換而達(dá)到的,同一時(shí)刻,一個(gè)內(nèi)核只能執(zhí)行一個(gè)指令,所以,對于每一個(gè)程序來說,必須有一個(gè)計(jì)數(shù)器來記錄程序的執(zhí)行進(jìn)度,這樣,當(dāng)現(xiàn)程恢復(fù)執(zhí)行的時(shí)候,才能從正確的地方開始,所以,每個(gè)線程都必須有一個(gè)獨(dú)立的程序計(jì)數(shù)器,這類計(jì)數(shù)器為線程私有的內(nèi)存。如果一個(gè)線程正在執(zhí)行一個(gè)Java方法,則計(jì)數(shù)器記錄的是字節(jié)碼的指令的地址,如果執(zhí)行的一個(gè)Nativ

9、e方法,則計(jì)數(shù)器的記錄為空,此內(nèi)存區(qū)是唯一一個(gè)在Java規(guī)范中沒有任何OutOfMemoryError情況的區(qū)域。2、JVM虛擬機(jī)棧(JVM Stacks)JVM虛擬機(jī)棧就是我們常說的堆棧的棧(我們常常把內(nèi)存粗略分為堆和棧),和程序計(jì)數(shù)器一樣,也是線程私有的,生命周期和線程一樣,每個(gè)方法被執(zhí)行的時(shí)候會(huì)產(chǎn)生一個(gè)棧幀,用于存儲(chǔ)局部變量表、動(dòng)態(tài)鏈接、操作數(shù)、方法出口等信息。方法的執(zhí)行過程就是棧幀在JVM中出棧和入棧的過程。局部變量表中存放的是各種基本數(shù)據(jù)類型,如boolean、byte、char、等8種,及引用類型(存放的是指向各個(gè)對象的內(nèi)存地址),因此,它有一個(gè)特點(diǎn):內(nèi)存空間可以在編譯期間就確定,

10、運(yùn)行期不在改變。這個(gè)內(nèi)存區(qū)域會(huì)有兩種可能的Java異常:StackOverFlowError和OutOfMemoryError。3、本地方法棧(Native Method Stacks)從名字即可看出,本地方法棧就是用來處理Java中的本地方法的,Java類的祖先類Object中有眾多Native方法,如hashCode()、wait()等,他們的執(zhí)行很多時(shí)候是借助于操作系統(tǒng),但是JVM需要對他們做一些規(guī)范,來處理他們的執(zhí)行過程。此區(qū)域,可以有不同的實(shí)現(xiàn)方法,向我們常用的Sun的JVM就是本地方法棧和JVM虛擬機(jī)棧是同一個(gè)。4、堆(Heap)堆內(nèi)存是內(nèi)存中最重要的一塊,也是最有必要進(jìn)行深究的一

11、部分。因?yàn)镴ava性能的優(yōu)化,主要就是針對這部分內(nèi)存的。所有的對象實(shí)例及數(shù)組都是在堆上面分配的(隨著JIT技術(shù)的逐漸成熟,這句話視乎有些絕對,不過至少目前還基本是這樣的),可通過-Xmx和-Xms來控制堆的大小。JIT技術(shù)的發(fā)展產(chǎn)生了新的技術(shù),如棧上分配和標(biāo)量替換,也許在不久的幾年里,即時(shí)編譯會(huì)誕生及成熟,那個(gè)時(shí)候,“所有的對象實(shí)例及數(shù)組都是在堆上面分配的”這句話就應(yīng)該稍微改改了。堆內(nèi)存是垃圾回收的主要區(qū)域,所以在下文垃圾回收板塊會(huì)重點(diǎn)介紹,此處只做概念方面的解釋。在32位系統(tǒng)上最大為2G,64位系統(tǒng)上無限制??赏ㄟ^-Xms和-Xmx控制,-Xms為JVM啟動(dòng)時(shí)申請的最小Heap內(nèi)存,-Xmx

12、為JVM可申請的最大Heap內(nèi)存。5、方法區(qū)(Method Area) 方法區(qū)是所有線程共享的內(nèi)存區(qū)域,用于存儲(chǔ)已經(jīng)被JVM加載的類信息、常量、靜態(tài)變量等數(shù)據(jù),一般來說,方法區(qū)屬于持久代(關(guān)于持久代,會(huì)在GC部分詳細(xì)介紹,除了持久代,還有新生代和舊生代),也難怪Java規(guī)范將方法區(qū)描述為堆的一個(gè)邏輯部分,但是它不是堆。方法區(qū)的垃圾回收比較棘手,就算是Sun的HotSpot VM在這方面也沒有做得多么完美。此處引入方法區(qū)中一個(gè)重要的概念:運(yùn)行時(shí)常量池。主要用于存放在編譯過程中產(chǎn)生的字面量(字面量簡單理解就是常量)和引用。一般情況,常量的內(nèi)存分配在編譯期間就能確定,但不一定全是,有一些可

13、能就是運(yùn)行時(shí)也可將常量放入常量池中,如String類中有個(gè)Native方法intern()<關(guān)于intern()的詳細(xì)說明,請看另一篇文章:此處補(bǔ)充一個(gè)在JVM內(nèi)存管理之外的一個(gè)內(nèi)存區(qū):直接內(nèi)存。在JDK1.4中新加入類NIO類,引入了一種基于通道與緩沖區(qū)的I/O方式,它可以使用Native函數(shù)庫直接分配堆外內(nèi)存,即我們所說的直接內(nèi)存,這樣在某些場景中會(huì)提高程序的性能。(8)JVM如何GC,新生代,老年代,持久代,都存儲(chǔ)哪些東西?(9)GC用的引用可達(dá)性分析算法中,哪些對象可作為GC Roots對象?(10)快速排序,過程,復(fù)雜度?(11)什么是二叉平衡樹,如何插入節(jié)點(diǎn),刪除節(jié)點(diǎn),說出關(guān)

14、鍵步驟。(12)TCP如何保證可靠傳輸?三次握手過程?通過設(shè)置滑動(dòng)窗口實(shí)現(xiàn)可靠傳輸?shù)?,發(fā)送方的窗口由接收方的緩存決定(13)TCP和UDP區(qū)別?TCP通信之前需要先建立連接,提供的是可靠的通信服務(wù),同時(shí)tcp只能支持一對一的通信,只能進(jìn)行單播,有擁塞控制,開銷較大UDP 通信不需要實(shí)現(xiàn)建立連接,提供的是盡最大努力的交付時(shí)不可靠的,支持一對一,一對多,多對一,多對多的通信方式,開銷較小,UDP沒有擁塞控制UDP是面向報(bào)文的,對應(yīng)用層交下來多長的數(shù)據(jù)既不拆分也不合并,只是添加首部后交給ip層注意:tcp連接的端點(diǎn)是套接字(14)滑動(dòng)窗口算法?(15)Linux下如何進(jìn)行進(jìn)程調(diào)度的?linux內(nèi)核的

15、三種調(diào)度方法:1,SCHED_OTHER 分時(shí)調(diào)度策略,2,SCHED_FIFO實(shí)時(shí)調(diào)度策略,先到先服務(wù)3,SCHED_RR實(shí)時(shí)調(diào)度策略,時(shí)間片輪轉(zhuǎn)linux內(nèi)核的三種調(diào)度方法:1,SCHED_OTHER 分時(shí)調(diào)度策略,2,SCHED_FIFO實(shí)時(shí)調(diào)度策略,先到先服務(wù)3,SCHED_RR實(shí)時(shí)調(diào)度策略,時(shí)間片輪轉(zhuǎn)實(shí)時(shí)進(jìn)程將得到優(yōu)先調(diào)用,實(shí)時(shí)進(jìn)程根據(jù)實(shí)時(shí)優(yōu)先級(jí)決定調(diào)度權(quán)值,分時(shí)進(jìn)程則通過nice和counter值決定權(quán)值,nice越小,counter越大,被調(diào)度的概率越大,也就是曾經(jīng)使用了cpu最少的進(jìn)程將會(huì)得到優(yōu)先調(diào)度。SHCED_RR和SCHED_FIFO的不同:當(dāng)采用SHCED_RR策略的進(jìn)

16、程的時(shí)間片用完,系統(tǒng)將重新分配時(shí)間片,并置于就緒隊(duì)列尾。放在隊(duì)列尾保證了所有具有相同優(yōu)先級(jí)的RR任務(wù)的調(diào)度公平。SCHED_FIFO一旦占用cpu則一直運(yùn)行。一直運(yùn)行直到有更高優(yōu)先級(jí)任務(wù)到達(dá)或自己放棄。如果有相同優(yōu)先級(jí)的實(shí)時(shí)進(jìn)程(根據(jù)優(yōu)先級(jí)計(jì)算的調(diào)度權(quán)值是一樣的)已經(jīng)準(zhǔn)備好,F(xiàn)IFO時(shí)必須等待該進(jìn)程主動(dòng)放棄后才可以運(yùn)行這個(gè)優(yōu)先級(jí)相同的任務(wù)。而RR可以讓每個(gè)任務(wù)都執(zhí)行一段時(shí)間。相同點(diǎn):RR和FIFO都只用于實(shí)時(shí)任務(wù)。創(chuàng)建時(shí)優(yōu)先級(jí)大于0(1-99)。按照可搶占優(yōu)先級(jí)調(diào)度算法進(jìn)行。就緒態(tài)的實(shí)時(shí)任務(wù)立即搶占非實(shí)時(shí)任務(wù)。所有任務(wù)都采用linux分時(shí)調(diào)度策略時(shí)。1,創(chuàng)建任務(wù)指定采用分時(shí)調(diào)度策略,并指定優(yōu)先

17、級(jí)nice值(-2019)。2,將根據(jù)每個(gè)任務(wù)的nice值確定在cpu上的執(zhí)行時(shí)間(counter)。3,如果沒有等待資源,則將該任務(wù)加入到就緒隊(duì)列中。4,調(diào)度程序遍歷就緒隊(duì)列中的任務(wù),通過對每個(gè)任務(wù)動(dòng)態(tài)優(yōu)先級(jí)的計(jì)算(counter+20-nice)結(jié)果,選擇計(jì)算結(jié)果最大的一個(gè)去運(yùn)行,當(dāng)這個(gè)時(shí)間片用完后(counter減至0)或者主動(dòng)放棄cpu時(shí),該任務(wù)將被放在就緒隊(duì)列末尾(時(shí)間片用完)或等待隊(duì)列(因等待資源而放棄cpu)中。5,此時(shí)調(diào)度程序重復(fù)上面計(jì)算過程,轉(zhuǎn)到第4步。6,當(dāng)調(diào)度程序發(fā)現(xiàn)所有就緒任務(wù)計(jì)算所得的權(quán)值都為不大于0時(shí),重復(fù)第2步。所有任務(wù)都采用FIFO時(shí),1,創(chuàng)建進(jìn)程時(shí)指定采用FI

18、FO,并設(shè)置實(shí)時(shí)優(yōu)先級(jí)rt_priority(1-99)。2,如果沒有等待資源,則將該任務(wù)加入到就緒隊(duì)列中。3,調(diào)度程序遍歷就緒隊(duì)列,根據(jù)實(shí)時(shí)優(yōu)先級(jí)計(jì)算調(diào)度權(quán)值(1000+rt_priority),選擇權(quán)值最高的任務(wù)使用cpu,該FIFO任務(wù)將一直占有cpu直到有優(yōu)先級(jí)更高的任務(wù)就緒(即使優(yōu)先級(jí)相同也不行)或者主動(dòng)放棄(等待資源)。4,調(diào)度程序發(fā)現(xiàn)有優(yōu)先級(jí)更高的任務(wù)到達(dá)(高優(yōu)先級(jí)任務(wù)可能被中斷或定時(shí)器任務(wù)喚醒,再或被當(dāng)前運(yùn)行的任務(wù)喚醒,等等),則調(diào)度程序立即在當(dāng)前任務(wù)堆棧中保存當(dāng)前cpu寄存器的所有數(shù)據(jù),重新從高優(yōu)先級(jí)任務(wù)的堆棧中加載寄存器數(shù)據(jù)到cpu,此時(shí)高優(yōu)先級(jí)的任務(wù)開始運(yùn)行。重復(fù)第3步。

19、5,如果當(dāng)前任務(wù)因等待資源而主動(dòng)放棄cpu使用權(quán),則該任務(wù)將從就緒隊(duì)列中刪除,加入等待隊(duì)列,此時(shí)重復(fù)第3步。所有任務(wù)都采用RR調(diào)度策略時(shí)1,創(chuàng)建任務(wù)時(shí)指定調(diào)度參數(shù)為RR,并設(shè)置任務(wù)的實(shí)時(shí)優(yōu)先級(jí)和nice值(nice值將會(huì)轉(zhuǎn)換為該任務(wù)的時(shí)間片的長度)。2,如果沒有等待資源,則將該任務(wù)加入到就緒隊(duì)列中。3,調(diào)度程序遍歷就緒隊(duì)列,根據(jù)實(shí)時(shí)優(yōu)先級(jí)計(jì)算調(diào)度權(quán)值(1000+rt_priority),選擇權(quán)值最高的任務(wù)使用cpu。4,如果就緒隊(duì)列中的RR任務(wù)時(shí)間片為0,則會(huì)根據(jù)nice值設(shè)置該任務(wù)的時(shí)間片,同時(shí)將該任務(wù)放入就緒隊(duì)列的末尾。重復(fù)步驟3。5,當(dāng)前任務(wù)由于等待資源而主動(dòng)退出cpu,則其加入等待隊(duì)列

20、中。重復(fù)步驟3。系統(tǒng)中既有分時(shí)調(diào)度,又有時(shí)間片輪轉(zhuǎn)調(diào)度和先進(jìn)先出調(diào)度1,RR調(diào)度和FIFO調(diào)度的進(jìn)程屬于實(shí)時(shí)進(jìn)程,以分時(shí)調(diào)度的進(jìn)程是非實(shí)時(shí)進(jìn)程。2,當(dāng)實(shí)時(shí)進(jìn)程準(zhǔn)備就緒后,如果當(dāng)前cpu正在運(yùn)行非實(shí)時(shí)進(jìn)程,則實(shí)時(shí)進(jìn)程立即搶占非實(shí)時(shí)進(jìn)程。3,RR進(jìn)程和FIFO進(jìn)程都采用實(shí)時(shí)優(yōu)先級(jí)做為調(diào)度的權(quán)值標(biāo)準(zhǔn),RR是FIFO的一個(gè)延伸。FIFO時(shí),如果兩個(gè)進(jìn)程的優(yōu)先級(jí)一樣,則這兩個(gè)優(yōu)先級(jí)一樣的進(jìn)程具體執(zhí)行哪一個(gè)是由其在隊(duì)列中的未知決定的,這樣導(dǎo)致一些不公正性(優(yōu)先級(jí)是一樣的,為什么要讓你一直運(yùn)行?),如果將兩個(gè)優(yōu)先級(jí)一樣的任務(wù)的調(diào)度策略都設(shè)為RR,則保證了這兩個(gè)任務(wù)可以循環(huán)執(zhí)行,保證了公平。(16)Linux

21、下你常用的命令有哪些?Cd ls shutdown mkdir rm reboot(17)操作系統(tǒng)什么情況下會(huì)死鎖?死鎖的一個(gè)因素是由于進(jìn)程競爭系統(tǒng)中的資源,而進(jìn)程對資源的總需求量超過系統(tǒng)提供的最大資源數(shù),或者進(jìn)程的推進(jìn)順序不當(dāng)也會(huì)導(dǎo)致死鎖(18)常用的hash算法有哪些?MD5 SHA-1(19)什么是一致性哈希?一致性哈希提出了在動(dòng)態(tài)變化的Cache環(huán)境中,哈希算法應(yīng)該滿足的4個(gè)適應(yīng)條件:折疊平衡性(Balance)平衡性是指哈希的結(jié)果能夠盡可能分布到所有的緩沖中去,這樣可以使得所有的緩沖空間都得到利用。很多哈希算法都能夠滿足這一條件。折疊單調(diào)性(Monotonicity)單調(diào)性是指如果已

22、經(jīng)有一些內(nèi)容通過哈希分派到了相應(yīng)的緩沖中,又有新的緩沖區(qū)加入到系統(tǒng)中,那么哈希的結(jié)果應(yīng)能夠保證原有已分配的內(nèi)容可以被映射到新的緩沖區(qū)中去,而不會(huì)被映射到舊的緩沖集合中的其他緩沖區(qū)。(這段翻譯信息有負(fù)面價(jià)值的,當(dāng)緩沖區(qū)大小變化時(shí)一致性哈希(Consistent hashing)盡量保護(hù)已分配的內(nèi)容不會(huì)被重新映射到新緩沖區(qū)。)簡單的哈希算法往往不能滿足單調(diào)性的要求,如最簡單的線性哈希:x ax + b mod (P)在上式中,P表示全部緩沖的大小。不難看出,當(dāng)緩沖大小發(fā)生變化時(shí)(從P1到P2),原來所有的哈希結(jié)果均會(huì)發(fā)生變化,從而不滿足單調(diào)性的要求。哈希結(jié)果的變化意味著當(dāng)緩沖空間發(fā)生變化時(shí),所有的

23、映射關(guān)系需要在系統(tǒng)內(nèi)全部更新。而在P2P系統(tǒng)內(nèi),緩沖的變化等價(jià)于Peer加入或退出系統(tǒng),這一情況在P2P系統(tǒng)中會(huì)頻繁發(fā)生,因此會(huì)帶來極大計(jì)算和傳輸負(fù)荷。單調(diào)性就是要求哈希算法能夠應(yīng)對這種情況。折疊分散性(Spread)在分布式環(huán)境中,終端有可能看不到所有的緩沖,而是只能看到其中的一部分。當(dāng)終端希望通過哈希過程將內(nèi)容映射到緩沖上時(shí),由于不同終端所見的緩沖范圍有可能不同,從而導(dǎo)致哈希的結(jié)果不一致,最終的結(jié)果是相同的內(nèi)容被不同的終端映射到不同的緩沖區(qū)中。這種情況顯然是應(yīng)該避免的,因?yàn)樗鼘?dǎo)致相同內(nèi)容被存儲(chǔ)到不同緩沖中去,降低了系統(tǒng)存儲(chǔ)的效率。分散性的定義就是上述情況發(fā)生的嚴(yán)重程度。好的哈希算法應(yīng)能夠盡

24、量避免不一致的情況發(fā)生,也就是盡量降低分散性。折疊負(fù)載(Load)負(fù)載問題實(shí)際上是從另一個(gè)角度看待分散性問題。既然不同的終端可能將相同的內(nèi)容映射到不同的緩沖區(qū)中,那么對于一個(gè)特定的緩沖區(qū)而言,也可能被不同的用戶映射為不同的內(nèi)容。與分散性一樣,這種情況也是應(yīng)當(dāng)避免的,因此好的哈希算法應(yīng)能夠盡量降低緩沖的負(fù)荷。從表面上看,一致性哈希針對的是分布式緩沖的問題,但是如果將緩沖看作P2P系統(tǒng)中的Peer,將映射的內(nèi)容看作各種共享的資源(數(shù)據(jù),文件,媒體流等),就會(huì)發(fā)現(xiàn)兩者實(shí)際上是在描述同一問題。路由算法在一致性哈希算法中,每個(gè)節(jié)點(diǎn)(對應(yīng)P2P系統(tǒng)中的Peer)都有隨機(jī)分配的ID。在將內(nèi)容映射到節(jié)點(diǎn)時(shí),使

25、用內(nèi)容的關(guān)鍵字和節(jié)點(diǎn)的ID進(jìn)行一致性哈希運(yùn)算并獲得鍵值。一致性哈希要求鍵值和節(jié)點(diǎn)ID處于同一值域。最簡單的鍵值和ID可以是一維的,比如從0000到9999的整數(shù)集合。根據(jù)鍵值存儲(chǔ)內(nèi)容時(shí),內(nèi)容將被存儲(chǔ)到具有與其鍵值最接近的ID的節(jié)點(diǎn)上。例如鍵值為1001的內(nèi)容,系統(tǒng)中有ID為1000,1010,1100的節(jié)點(diǎn),該內(nèi)容將被映射到1000節(jié)點(diǎn)。為了構(gòu)建查詢所需的路由,一致性哈希要求每個(gè)節(jié)點(diǎn)存儲(chǔ)其上行節(jié)點(diǎn)(ID值大于自身的節(jié)點(diǎn)中最小的)和下行節(jié)點(diǎn)(ID值小于自身的節(jié)點(diǎn)中最大的)的位置信息(IP地址)。當(dāng)節(jié)點(diǎn)需要查找內(nèi)容時(shí),就可以根據(jù)內(nèi)容的鍵值決定向上行或下行節(jié)點(diǎn)發(fā)起查詢請求。收到查詢請求的節(jié)點(diǎn)如果發(fā)現(xiàn)

26、自己擁有被請求的目標(biāo),可以直接向發(fā)起查詢請求的節(jié)點(diǎn)返回確認(rèn);如果發(fā)現(xiàn)不屬于自身的范圍,可以轉(zhuǎn)發(fā)請求到自己的上行/下行節(jié)點(diǎn)。為了維護(hù)上述路由信息,在節(jié)點(diǎn)加入/退出系統(tǒng)時(shí),相鄰的節(jié)點(diǎn)必須及時(shí)更新路由信息。這就要求節(jié)點(diǎn)不僅存儲(chǔ)直接相連的下行節(jié)點(diǎn)位置信息,還要知道一定深度(n跳)的間接下行節(jié)點(diǎn)信息,并且動(dòng)態(tài)地維護(hù)節(jié)點(diǎn)列表。當(dāng)節(jié)點(diǎn)退出系統(tǒng)時(shí),它的上行節(jié)點(diǎn)將嘗試直接連接到最近的下行節(jié)點(diǎn),連接成功后,從新的下行節(jié)點(diǎn)獲得下行節(jié)點(diǎn)列表并更新自身的節(jié)點(diǎn)列表。同樣的,當(dāng)新的節(jié)點(diǎn)加入到系統(tǒng)中時(shí),首先根據(jù)自身的ID找到下行節(jié)點(diǎn)并獲得下行節(jié)點(diǎn)列表,然后要求上行節(jié)點(diǎn)修改其下行節(jié)點(diǎn)列表,這樣就恢復(fù)了路由關(guān)系。(20)如何理解

27、分布式鎖?分布式鎖是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式。在分布式系統(tǒng)中,常常需要協(xié)調(diào)他們的動(dòng)作。如果不同的系統(tǒng)或是同一個(gè)系統(tǒng)的不同主機(jī)之間共享了一個(gè)或一組資源,那么訪問這些資源的時(shí)候,往往需要互斥來防止彼此干擾來保證一致性,在這種情況下,便需要使用到分布式鎖。在分布式系統(tǒng)中,常常需要協(xié)調(diào)他們的動(dòng)作。如果不同的系統(tǒng)或是同一個(gè)系統(tǒng)的不同主機(jī)之間共享了一個(gè)或一組資源,那么訪問這些資源的時(shí)候,往往需要互斥來防止彼此干擾來保證一致性,這個(gè)時(shí)候,便需要使用到分布式鎖。1 (21)數(shù)據(jù)庫中的范式有哪些?第一范式(1NF)所謂第一范式(1NF)是指在關(guān)系模型中,對域添加的一個(gè)規(guī)范要求,所有

28、的域都應(yīng)該是原子性的,即數(shù)據(jù)庫表的每一列都是不可分割的原子數(shù)據(jù)項(xiàng),而不能是集合,數(shù)組,記錄等非原子數(shù)據(jù)項(xiàng)。即實(shí)體中的某個(gè)屬性有多個(gè)值時(shí),必須拆分為不同的屬性。在符合第一范式(1NF)表中的每個(gè)域值只能是實(shí)體的一個(gè)屬性或一個(gè)屬性的一部分。簡而言之,第一范式就是無重復(fù)的域。說明:在任何一個(gè)關(guān)系數(shù)據(jù)庫中,第一范式(1NF)是對關(guān)系模式的設(shè)計(jì)基本要求,一般設(shè)計(jì)中都必須滿足第一范式(1NF)。不過有些關(guān)系模型中突破了1NF的限制,這種稱為非1NF的關(guān)系模型。換句話說,是否必須滿足1NF的最低要求,主要依賴于所使用的關(guān)系模型。第二范式(2NF)在1NF的基礎(chǔ)上,非碼屬性必須完全依賴于候選碼(在1NF基礎(chǔ)上

29、消除非主屬性對主碼的部分函數(shù)依賴)第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。第二范式(2NF)要求數(shù)據(jù)庫表中的每個(gè)實(shí)例或記錄必須可以被唯一地區(qū)分。選取一個(gè)能區(qū)分每個(gè)實(shí)體的屬性或?qū)傩越M,作為實(shí)體的唯一標(biāo)識(shí)。例如在員工表中的身份證號(hào)碼即可實(shí)現(xiàn)每個(gè)一員工的區(qū)分,該身份證號(hào)碼即為候選鍵,任何一個(gè)候選鍵都可以被選作主鍵。在找不到候選鍵時(shí),可額外增加屬性以實(shí)現(xiàn)區(qū)分,如果在員工關(guān)系中,沒有對其身份證號(hào)進(jìn)行存儲(chǔ),而姓名可能會(huì)在數(shù)據(jù)庫運(yùn)行的某個(gè)時(shí)間重復(fù),無法區(qū)分出實(shí)體時(shí),設(shè)計(jì)辟如ID等不重復(fù)的編號(hào)以實(shí)現(xiàn)區(qū)分,被添加的編號(hào)或ID選作主鍵。(該

30、主鍵的添加是在ER設(shè)計(jì)時(shí)添加,不是建庫時(shí)隨意添加)第二范式(2NF)要求實(shí)體的屬性完全依賴于主關(guān)鍵字。所謂完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性,如果存在,那么這個(gè)屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來形成一個(gè)新的實(shí)體,新實(shí)體與原實(shí)體之間是一對多的關(guān)系。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列,以存儲(chǔ)各個(gè)實(shí)例的唯一標(biāo)識(shí)。簡而言之,第二范式就是在第一范式的基礎(chǔ)上屬性完全依賴于主鍵。第三范式(3NF)在1NF基礎(chǔ)上,任何非主屬性不依賴于其它非主屬性(在2NF基礎(chǔ)上消除傳遞依賴)第三范式(3NF)是第二范式(2NF)的一個(gè)子集,即滿足第三范式(3NF)必須滿足第二范式(2NF)。簡而言之,第三范式(3

31、NF)要求一個(gè)關(guān)系中不包含已在其它關(guān)系已包含的非主關(guān)鍵字信息。例如,存在一個(gè)部門信息表,其中每個(gè)部門有部門編號(hào)(dept_id)、部門名稱、部門簡介等信息。那么在員工信息表中列出部門編號(hào)后就不能再將部門名稱、部門簡介等與部門有關(guān)的信息再加入員工信息表中。如果不存在部門信息表,則根據(jù)第三范式(3NF)也應(yīng)該構(gòu)建它,否則就會(huì)有大量的數(shù)據(jù)冗余。簡而言之,第三范式就是屬性不依賴于其它非主屬性,也就是在滿足2NF的基礎(chǔ)上,任何非主屬性不得傳遞依賴于主屬性。巴斯-科德范式(BCNF)Boyce-Codd Normal Form(巴斯-科德范式)在1NF基礎(chǔ)上,任何非主屬性不能對主鍵子集依賴(在3NF基礎(chǔ)上

32、消除對主碼子集的依賴)巴斯-科德范式(BCNF)是第三范式(3NF)的一個(gè)子集,即滿足巴斯-科德范式(BCNF)必須滿足第三范式(3NF)。通常情況下,巴斯-科德范式被認(rèn)為沒有新的設(shè)計(jì)規(guī)范加入,只是對第二范式與第三范式中設(shè)計(jì)規(guī)范要求更強(qiáng),因而被認(rèn)為是修正第三范式,也就是說,它事實(shí)上是對第三范式的修正,使數(shù)據(jù)庫冗余度更小。這也是BCNF不被稱為第四范式的原因。某些書上,根據(jù)范式要求的遞增性將其稱之為第四范式是不規(guī)范,也是更讓人不容易理解的地方。而真正的第四范式,則是在設(shè)計(jì)規(guī)范中添加了對多值及依賴的要求。對于BCNF,在主碼的任何一個(gè)真子集都不能決定于主屬性。關(guān)系中U主碼,若U中的任何一個(gè)真子集X

33、都不能決定于主屬性Y,則該設(shè)計(jì)規(guī)范屬性BCNF。例如:在關(guān)系R中,U為主碼,A屬性是主碼中的一個(gè)屬性,若存在A->Y,Y為主屬性,則該關(guān)系不屬于BCNF。一般關(guān)系型數(shù)據(jù)庫設(shè)計(jì)中,達(dá)到BCNF就可以了?。?2)數(shù)據(jù)庫中的索引的結(jié)構(gòu)?什么情況下適合建索引?索引的實(shí)現(xiàn)通常使用B樹及其變種B+樹。需要進(jìn)行高質(zhì)量的查詢或者加快查詢速度的時(shí)候(24)用什么工具調(diào)試程序?JConsole,用過嗎?JConsole是一個(gè)基于JMX的GUI工具,用于連接正在運(yùn)行的JVM,不過此JVM需要使用可管理的模式啟動(dòng)就是某段代碼申請的某一塊內(nèi)存一直都得不到釋放,而這段代碼又不斷在申請內(nèi)存空間,使得機(jī)器內(nèi)存一直被消耗

34、。解決方法需要看你具體遇到的情況,如果是你的代碼有問題,可以通過Jconsole等工具去查看(25)現(xiàn)在JVM中有一個(gè)線程掛起了,如何用工具查出原因?jstack(查看線程)、jmap(查看內(nèi)存)和jstat(性能分析)命令(26)線程同步與阻塞的關(guān)系?同步一定阻塞嗎?阻塞一定同步嗎?· 阻塞狀態(tài)是指正在執(zhí)行的進(jìn)程由于發(fā)生某事情而暫時(shí)無法繼續(xù)執(zhí)行時(shí),便放棄處理機(jī)而處于暫停狀態(tài)。· 進(jìn)程同步:對多個(gè)相關(guān)進(jìn)程在執(zhí)行次序上進(jìn)行協(xié)調(diào),以使并發(fā)執(zhí)行的進(jìn)程之間能有效共享資源和互相合作,從而使程序的執(zhí)行具有可再現(xiàn)性(27)同步和異步有什么區(qū)別?同步就是指一個(gè)線程要等待上一個(gè)線程執(zhí)行完之后

35、才開始執(zhí)行當(dāng)前的線程異步是指一個(gè)線程去執(zhí)行,它的下一個(gè)線程不必等待它執(zhí)行完就開始執(zhí)行(28)線程池用過嗎?  在java中,如果每個(gè)請求到達(dá)就創(chuàng)建一個(gè)新線程,開銷是相當(dāng)大的。在實(shí)際使用中,服務(wù)器在創(chuàng)建和銷毀線程上花費(fèi)的時(shí)間和消耗的系統(tǒng)資源都相當(dāng)大,甚至可能要比在處理實(shí)際的用戶請求的時(shí)間和資源要多的多。除了創(chuàng)建和銷毀線程的開銷之外,活動(dòng)的線程也需要消耗系統(tǒng)資源。如果在一個(gè)jvm里創(chuàng)建太多的線程,可能會(huì)使系統(tǒng)由于過度消耗內(nèi)存或“切換過度”而導(dǎo)致系統(tǒng)資源不足。為了防止資源不足,服務(wù)器應(yīng)用程序需要采取一些辦法來限制任何給定時(shí)刻處理的請求數(shù)目,盡可能減少創(chuàng)建和銷毀線程的次數(shù),特別是一些資源耗費(fèi)

36、比較大的線程的創(chuàng)建和銷毀,盡量利用已有對象來進(jìn)行服務(wù),這就是“池化資源”技術(shù)產(chǎn)生的原因。     線程池主要用來解決線程生命周期開銷問題和資源不足問題。通過對多個(gè)任務(wù)重復(fù)使用線程,線程創(chuàng)建的開銷就被分?jǐn)偟搅硕鄠€(gè)任務(wù)上了,而且由于在請求到達(dá)時(shí)線程已經(jīng)存在,所以消除了線程創(chuàng)建所帶來的延遲。這樣,就可以立即為請求服務(wù),使用應(yīng)用程序響應(yīng)更快。另外,通過適當(dāng)?shù)恼{(diào)整線程中的線程數(shù)目可以防止出現(xiàn)資源不足的情況。2.線程池的組成部分    一個(gè)比較簡單的線程池至少應(yīng)包含線程池管理器、工作線程、任務(wù)列隊(duì)、任務(wù)接口等部分。其中線程池管理器的作用

37、是創(chuàng)建、銷毀并管理線程池,將工作線程放入線程池中;工作線程是一個(gè)可以循環(huán)執(zhí)行任務(wù)的線程,在沒有任務(wù)是進(jìn)行等待;任務(wù)列隊(duì)的作用是提供一種緩沖機(jī)制,將沒有處理的任務(wù)放在任務(wù)列隊(duì)中;任務(wù)接口是每個(gè)任務(wù)必須實(shí)現(xiàn)的接口,主要用來規(guī)定任務(wù)的入口、任務(wù)執(zhí)行完后的收尾工作、任務(wù)的執(zhí)行狀態(tài)等,工作線程通過該接口調(diào)度任務(wù)的執(zhí)行。      線程池管理器至少有下列功能:創(chuàng)建線程池,銷毀線程池,添加新任務(wù)。     3.線程池適合應(yīng)用的場合      當(dāng)一個(gè)服

38、務(wù)器接受到大量短小線程的請求時(shí),使用線程池技術(shù)是非常合適的,它可以大大減少線程的創(chuàng)建和銷毀次數(shù),提高服務(wù)器的工作效率。但是線程要求的運(yùn)動(dòng)時(shí)間比較長,即線程的運(yùn)行時(shí)間比(29)如何創(chuàng)建單例模式?說了雙重檢查,他說不是線程安全的。如何高效的創(chuàng)建一個(gè)線程安全的單例?(30)concurrent包下面,都用過什么?(31)常用的數(shù)據(jù)庫有哪些?redis用過嗎?(33)你知道的開源協(xié)議有哪些?BSD 開源協(xié)議( original BSD license 、 FreeBSD license 、 Original BSD license )

39、0;   BSD 開源協(xié)議是一個(gè)給于使用者很大自由的協(xié)議。基本上使用者可以” 為所欲為”, 可以自由的使用,修改源代碼,也可以將修改后的代碼作為開源或者專有軟件再發(fā)布。但” 為所欲為” 的前提當(dāng)你發(fā)布使用了BSD 協(xié)議的代碼,或則以BSD 協(xié)議代碼為基礎(chǔ)做二次開發(fā)自己的產(chǎn)品時(shí),需要滿足三個(gè)條件:1. 如果再發(fā)布的產(chǎn)品中包含源代碼,則在源代碼中必須帶有原來代碼中的BSD 協(xié)議。2. 如果再發(fā)布的只是二進(jìn)制類庫/ 軟件,則需要在類庫/ 軟件的文檔和版權(quán)聲明中包含原來代碼中的BSD 協(xié)議。3. 不可以用開源代碼的作者/ 機(jī)構(gòu)名字和原來產(chǎn)品的名字做市場推廣。 &

40、#160;  BSD 代碼鼓勵(lì)代碼共享,但需要尊重代碼作者的著作權(quán)。BSD 由于允許使用者修改和重新發(fā)布代碼,也允許使用或在BSD 代碼上開發(fā)商業(yè)軟件發(fā)布和銷售,因此是對 商業(yè)集成很友好的協(xié)議。而很多的公司企業(yè)在選用開源產(chǎn)品的時(shí)候都首選BSD 協(xié)議,因?yàn)榭梢酝耆刂七@些第三方的代碼,在必要的時(shí)候可以修改或者二次開發(fā)。Apache Licence 2.0 ( Apache License, Version 2.0 、Apache License, Version 1.1 、Apache License, Version 1.0 )

41、60;   Apache Licence 是著名的非盈利開源組織Apache 采用的協(xié)議。該協(xié)議和BSD 類似,同樣鼓勵(lì)代碼共享和尊重原作者的著作權(quán),同樣允許代碼修改,再發(fā)布(作為開源或商業(yè)軟件)。需要滿足的條件也和BSD 類似:1. 需要給代碼的用戶一份Apache Licence2. 如果你修改了代碼,需要再被修改的文件中說明。3. 在延伸的代碼中(修改和有源代碼衍生的代碼中)需要帶有原來代碼中的協(xié)議,商標(biāo),專利聲明和其他原來作者規(guī)定需要包含的說明。4. 如果再發(fā)布的產(chǎn)品中包含一個(gè)Notice 文件,則在Notice 文件中需要帶有Apache Licence

42、 。你可以在Notice 中增加自己的許可,但不可以表現(xiàn)為對Apache Licence 構(gòu)成更改。Apache Licence 也是對商業(yè)應(yīng)用友好的許可。使用者也可以在需要的時(shí)候修改代碼來滿足需要并作為開源或商業(yè)產(chǎn)品發(fā)布/ 銷售。GPL ( GNU General Public License )    我們很熟悉的Linux 就是采用了GPL 。GPL 協(xié)議和BSD, Apache Licence 等鼓勵(lì)代碼重用的許可很不一樣。GPL 的出發(fā)點(diǎn)是代碼的開源/ 免費(fèi)使用和引用/ 修改/ 衍生代碼的開源/ 免費(fèi)使用,但不允許修改后和衍

43、生的代 碼做為閉源的商業(yè)軟件發(fā)布和銷售。這也就是為什么我們能用免費(fèi)的各種linux ,包括商業(yè)公司的linux 和linux 上各種各樣的由個(gè)人,組織,以及商業(yè)軟件公司開發(fā)的免費(fèi)軟件了。    GPL 協(xié)議的主要內(nèi)容是只要在一個(gè)軟件中使用(” 使用” 指類庫引用,修改后的代碼或者衍生代碼)GPL 協(xié)議的產(chǎn)品,則該軟件產(chǎn)品必須也采用GPL 協(xié)議,既必須也是開源和免費(fèi)。這就是所謂的” 傳染性” 。GPL 協(xié)議的產(chǎn)品作為一個(gè)單獨(dú)的產(chǎn)品使用沒有任何問題,還可以享受免費(fèi)的優(yōu)勢。    由于GPL 嚴(yán)格要求使用了GP

44、L 類庫的軟件產(chǎn)品必須使用GPL 協(xié)議,對于使用GPL 協(xié)議的開源代碼,商業(yè)軟件或者對代碼有保密要求的部門就不適合集成/ 采用作為類庫和二次開發(fā)的基礎(chǔ)。其它細(xì)節(jié)如再發(fā)布的時(shí)候需要伴隨GPL 協(xié)議等和BSD/Apache 等類似。LGPL ( GNU Lesser General Public License )    LGPL 是GPL 的一個(gè)為主要為類庫使用設(shè)計(jì)的開源協(xié)議。和GPL 要求任何使用/ 修改/ 衍生之GPL 類庫的的軟件必須采用GPL 協(xié)議不同。LGPL 允許商業(yè)軟件通過類庫引用(link) 方式使用LGPL 類庫而不需

45、要開源商業(yè)軟件的代碼。這使得采用LGPL 協(xié)議的開源代碼可以被商業(yè)軟件作為類庫引用并 發(fā)布和銷售。    但是如果修改LGPL 協(xié)議的代碼或者衍生,則所有修改的代碼,涉及修改部分的額外代碼和衍生的代碼都必須采用LGPL 協(xié)議。因此LGPL 協(xié)議的開源 代碼很適合作為第三方類庫被商業(yè)軟件引用,但不適合希望以LGPL 協(xié)議代碼為基礎(chǔ),通過修改和衍生的方式做二次開發(fā)的商業(yè)軟件采用。    GPL/LGPL 都保障原作者的知識(shí)產(chǎn)權(quán),避免有人利用開源代碼復(fù)制并開發(fā)類似的產(chǎn)品MIT (MIT )  

46、;  MIT 是和BSD 一樣寬范的許可協(xié)議, 作者只想保留版權(quán), 而無任何其他了限制. 也就是說, 你必須在你的發(fā)行版里包含原許可協(xié)議的聲明, 無論你是以二進(jìn)制發(fā)布的還是以源代碼發(fā)布的.(34)你知道的開源軟件有哪些?CentOS、 Apache(httpd)、Jboss、Tomcat、Jmeter、Maven、Eclipse、Spring(37)了解哪些設(shè)計(jì)模式?說說都用過哪些設(shè)計(jì)模式(38)如何判斷一個(gè)單鏈表是否有環(huán)?設(shè)置兩個(gè)指針,一個(gè)每次加一,一個(gè)每次加二,若快的和慢的指向同一個(gè)地方則有換,若快的遇到null終止則無環(huán)(39)操作系統(tǒng)如何進(jìn)行分頁調(diào)度?(40)匿名內(nèi)

47、部類是什么?如何訪問在其外面定義的變量?Comparable<T> comparable = new Comparable<T>() Overridepublic int compareTo(T o) return 0;如果定義一個(gè)匿名內(nèi)部類,并且希望它使用一個(gè)在其外部定的對象,那么編譯器會(huì)要求其參數(shù)引用是final的。 1.匿名內(nèi)部類肯定是局部內(nèi)部類(在一個(gè)方法里面定義的內(nèi)部類),因?yàn)樵趈ava中,語句必須寫在方法里,而匿名內(nèi)部類其實(shí)就是一條特殊的語句; 2.外部給定的對象就是所有外來的對象:外部方法的形參、局部變量、基本類型或自定義類型等。

48、60;3.內(nèi)部類很微妙,它可以直接訪問外部類的,這打破了類的封裝。但是內(nèi)部類又有它自身的好處,比如簡潔,可見性等,于是就把它定位成“只讀”,也就是。不過這個(gè)保護(hù)也非常脆弱! 4.local inner class訪問local var時(shí),那個(gè)var必須是final的。因?yàn)榭梢酝ㄟ^enclosing class訪問那個(gè)local var,也可以通過inner class訪問,可能造成問題,所以就必須是final的 5.匿名內(nèi)部類為什么只能用final.是變量的作用域的問題,因?yàn)槟涿麅?nèi)部類是出現(xiàn)在一個(gè)方法的內(nèi)部的,如果它要訪問這個(gè)方法的參數(shù)或者方法中定義的變量,則這些參數(shù)和變量

49、必須被修飾為final。因?yàn)殡m然匿名內(nèi)部類在方法的內(nèi)部,但實(shí)際編譯的時(shí)候,內(nèi)部類編譯成Outer.Inner,這說明內(nèi)部類所處的位置和外部類中的方法處在同一個(gè)等級(jí)上,外部類中的方法中的變量或參數(shù)只是方法的局部變量,這些變量或參數(shù)的作用域只在這個(gè)方法內(nèi)部有效。因?yàn)榫幾g的時(shí)候內(nèi)部類和方法在同一級(jí)別上,所以方法中的變量或參數(shù)只有為final,內(nèi)部類才可以引用。 這就是匿名內(nèi)部類1. 接口和抽象類的區(qū)別接口的所有方法都是public 的 接口中方法不能有實(shí)體 接口沒有構(gòu)造函數(shù),接口中的所有類都是final的接口可以多繼承,抽象類不行抽象類中的方法不一定都是public的, 抽象類中可以有實(shí)現(xiàn)

50、的方法,抽象類有構(gòu)造函數(shù),抽象類有普通的成員變量2. final/finally/finalize的區(qū)別final 修飾屬性 方法 類 修飾的屬性值是不能改變的, 方法不能被覆蓋, 類不能被繼承finally 保證程序一定會(huì)執(zhí)行的地方,無論程序是否出現(xiàn)異常,都會(huì)執(zhí)行的地方,通常用于釋放資源3. 鏈表的反轉(zhuǎn)可以順序遍歷鏈表 將節(jié)點(diǎn)存入堆棧,再彈出來就可以反轉(zhuǎn)了,但是耗費(fèi)內(nèi)存5.海量數(shù)據(jù)的快速查找6.大數(shù)的加法1、問:你把java內(nèi)存模型的架構(gòu)給我畫一下吧? 我: 遲疑了一下,心想,JMM這玩意兒有架構(gòu)圖嗎?這可怎么畫。面試官看我遲疑,說,那你不畫,先說一說吧,我就跟他說了由于什么指令重

51、排序,處理器緩存什么的,不同的系統(tǒng)或者平臺(tái)有不同的內(nèi)存模型,使得相同的java程序在不同的處理器架構(gòu)下的表現(xiàn)不一致啊,java內(nèi)存模型就是為了在不同的處理器架構(gòu)和平臺(tái)下給java程序員提供一致性內(nèi)存訪問的保證的。本以為后面要問到volatile的內(nèi)存語義,內(nèi)存屏障,happens-before之類的,沒想到面試官來了一句:你完全說錯(cuò)了,你說的這個(gè)是java的跨平臺(tái)特性,不是內(nèi)存模型,然后說內(nèi)存模型是什么什么堆、棧之類的。 于是我就懵了,我就想到了原來面試官理解的內(nèi)存模型就是我理解的java運(yùn)行時(shí)數(shù)據(jù)區(qū)域(程序計(jì)數(shù)器,虛擬機(jī)棧,本地方法棧、java堆,方法區(qū))。我也不敢跟面試官多爭論,

52、簡單地表達(dá)了一下我的觀點(diǎn),然后他就接著問我,那你說說java是如何實(shí)現(xiàn)跨平臺(tái)的。 2、問:說一下HashMap是如何實(shí)現(xiàn)的吧 我:就先畫了一下結(jié)構(gòu),再說了一些什么拉鏈法解決沖突,什么JDK8里面沖突達(dá)到一定數(shù)量的時(shí)候就改用了紅黑樹的存儲(chǔ)等等,然后問我怎么擴(kuò)容。 3、問:說一下ConcurrentHashMap吧 我:JDK7里面采用的是分段鎖機(jī)制什么的,讀的時(shí)候不加鎖,寫的時(shí)候分段加鎖,先定位到某個(gè)段,然后段里面的操作委托給HashMap等等。然后又說JDK8里面 ConcurrentHashMap有很大變化,從1600多行代碼擴(kuò)充到了6000多行代碼。

53、(還好沒接著問我JDK8里面是怎么實(shí)現(xiàn)的,就昨天晚上瞄了一眼,6000多行代碼確實(shí)沒看下來) 4、問:用他的電腦給我看了一段程序,問我輸出結(jié)果是什么,跟finally塊相關(guān)的,考察點(diǎn)就是try塊里面return了某個(gè)值,finally里面又對該值進(jìn)行操作了,問最后的結(jié)果是什么,我知道return之前會(huì)先執(zhí)行finally塊里面的操作,但是操作的是引用類型還是值類型的情況是不一樣的。本想把那個(gè)代碼回憶起來,想想還是算了,應(yīng)該有人能知道我說的是什么意思。我在回答這道題的時(shí)候面試官還“賤賤地“說這道題是有坑的,然后看我踩坑了還很鄙視的說一句:看那么多書連引用類型和值類型都搞不清楚。5、sy

54、nchronized相關(guān)的,為什么同步塊太大會(huì)影響性能?不同的線程擁有不同的對象鎖,它們之間會(huì)有影響嗎?如果synchronized加在靜態(tài)方法上面那么鎖指的是什么?(在這個(gè)地方又跟面試官就幾個(gè)名詞糾纏了一會(huì)兒,我說鎖是Class對象,他問是實(shí)例還是對象,他說實(shí)例是靜態(tài)的,對象是動(dòng)態(tài)的,我說Class是靜態(tài)的,對象是動(dòng)態(tài)的,然后他說我們不說類了,用英文,instance和對象,我說instance我理解的就是對象啊,可能他覺得instance是指類,對象就是new出來的對象,也許是我沒看過英文版的書吧)于是我接著說,指的是對象,是java虛擬機(jī)將一個(gè)類的字節(jié)碼加載進(jìn)內(nèi)存之后生成的一個(gè)java.

55、lang.Class對象,然后他可能沒聽明白我說的,還是在問,到底是類還是對象,我其實(shí)已經(jīng)明白他的意思了,然后說,按照您的描述,那就是類。然后他好像滿意了,就下一題了。(那明明就是一個(gè)Class對象嘛,Class對象不也是對象)6、問:基本排序和查找相關(guān)的,問我有哪些排序和哪些查找算法,(期待讓我寫個(gè)快排什么的,早就憋在心里了,分分鐘搞定的事, 然而并沒有)他讓我描述一下選擇排序的過程,就扯了扯,然后他問,你確定這是選擇排序嗎?我說,我很確定。(強(qiáng)調(diào)了“很”字,說的很堅(jiān)決,他也沒說什么,希望別又在理解上面跟我有偏差,我說的那個(gè)絕對是純正的選擇排序,如假包換)。7、寫代碼,給我5分鐘,

56、讓我實(shí)現(xiàn)一個(gè)Stack,底層數(shù)據(jù)結(jié)構(gòu)用數(shù)組。我問他需要支持?jǐn)U容嗎,他說先不用。寫完他拿過去一看,可能是我寫的太丑了,他又還給我,讓我解釋一下代碼,然后就解釋了一下。8、問我用棧怎么實(shí)現(xiàn)隊(duì)列,我說用2個(gè)棧來實(shí)現(xiàn),他問我具體怎么操作,我說我可以想一下嗎?他說可以,然后我想了一下,畫個(gè)圖給演示了一下。9、問我有沒有登過網(wǎng)頁版微信,問我用手機(jī)掃二維碼登錄是怎么實(shí)現(xiàn)的。不會(huì)10、問我知道阻塞隊(duì)列嗎,讓我自己實(shí)現(xiàn)阻塞隊(duì)列我會(huì)怎么做?我說我會(huì)用兩種方法來實(shí)現(xiàn),一種是用wait和notify的方式,一種是用Condition條件變量的方式,然后他問怎么用wait和notify實(shí)現(xiàn),我就把思路說了一下。最后他還

57、問我是什么時(shí)候接觸編程的,我說大一。我不知道他最后問了我一個(gè)這個(gè)問題是什么意思就想起來這么些了,整整70分鐘,我已經(jīng)說的口干舌燥了。面試完,他說,今天的面試結(jié)束了,我頓時(shí)就懵了,按照我了解的,這就代表沒通過的意思,但是我覺得我答的很好,百分之九十都答出來了,而且很多都說的很詳細(xì)。我一臉疑惑,還是很客氣的說謝謝,準(zhǔn)備走呢,馬上又聽到他說,你先到外面等一下,然后我又說好的,謝謝。然后他接著說,準(zhǔn)備下一輪吧,我說好的,謝謝。然后就出來了。出來之后到了等候的大廳,整個(gè)人都虛脫了,又左看看,右看看,還是沒有水,沒過幾分鐘,元?dú)膺€沒恢復(fù),讓我去二面二面:45分鐘。拖著疲憊的身子,走到二面面試官前,一見其人

58、,明顯能感受到這就是大神,那拖鞋,那發(fā)型,那胡子,此時(shí)我已經(jīng)身心俱疲,硬著頭皮坐下來,先自我介紹,問了幾個(gè)問題,然后說那我們寫一個(gè)簡單的題目吧。他把電腦轉(zhuǎn)過來,讓我看其中某個(gè)題目,說你做一下這道題吧。用java統(tǒng)計(jì)一個(gè)文本文件中出現(xiàn)的頻率最高的20個(gè)單詞。多經(jīng)典的題目啊。我問能用shell命令來實(shí)現(xiàn)嗎?他說用java。于是我用了HashMap,都弄到map里面去了之后,我發(fā)現(xiàn)我不會(huì)排序。集合類里面的排序方法確實(shí)沒怎么用過,于是我就卡在這里了。然后我跟他說我數(shù)據(jù)結(jié)構(gòu)選錯(cuò)了,我應(yīng)該選能排序的map,比如說TreeMap,他說那你接著寫,我又不想寫了,因?yàn)槲抑皇侵繲reeMap是怎么一回事,并沒有

59、去用過這個(gè)TreeMap,而且排序的話它應(yīng)該是按照key來排序的,我這里的key是單詞,并沒有什么用,我也不知道該怎么按照后面的value來排序,我也想到可以調(diào)用map的entrySet方法得到一個(gè)集合,然后我可以對這個(gè)集合進(jìn)行操作,總之我想了很多,但是對一些操作不太熟就沒有繼續(xù)下去了。我覺得這道題目應(yīng)該很簡單啊,沒想到我竟然沒寫出來。其實(shí)方法還是有的,map都拿到了,排個(gè)序豈能難倒我,大不了再倒騰一下,我冒泡也能給它解決了,但是我實(shí)在是不想用這么low的方式,然后我就放棄了,沒接著寫。然后面試官說,好的,那我們再來寫一個(gè)簡單的題目吧。題目大概意思就是用面向?qū)ο蟮乃枷雽?shí)現(xiàn)題目說的那個(gè)場景,具體

60、題目就不說了,我并沒有太明白題目的意思,感覺可以用一個(gè)HashMap的數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn),然后我就自己照著HashMap的代碼寫了寫,寫了點(diǎn)我又停下了,因?yàn)槲也]有太理解題目的意思,所以我也不知道該怎么寫,于是我又放棄了,真要我實(shí)現(xiàn)一個(gè)HashMap我也是可以寫出來的,畢竟源碼我看過很多遍了,一是想到有點(diǎn)麻煩,二是想到我可能沒正確理解題目的意思,然后我就放棄了,放棄了,棄了,了。兩道題目下來,我心理已經(jīng)被擊潰了,然后他問我有沒有研究java方面的新技術(shù),問我想從事哪一方面的開發(fā),問我阿里云,淘寶等等這些有沒有對哪個(gè)比較有意向,這個(gè)時(shí)候的我意識(shí)已經(jīng)開始模糊了,話也說不清楚了,舌頭也捋不順了,這幾個(gè)開放性的問題答的我都恨不得抽死自己。總之,一面給自己打90分,二面給自己打20分經(jīng)驗(yàn)就不說了,沒什么好的經(jīng)驗(yàn)教訓(xùn)就說一下吧: 面試之前

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論