版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、java面試總結(jié)報(bào)告java 面試總結(jié)報(bào)告java面試總結(jié)報(bào)告怎么寫?下面是帶來的java面試總結(jié)報(bào)告,歡迎閱讀!多線程、并發(fā)及線程的基礎(chǔ)問題:1)Java 中能創(chuàng)建volatile數(shù)組嗎?能,Java中可以創(chuàng)建volatile類型數(shù)組,不過只是一個(gè)指向數(shù)組的引用,而不是整個(gè)數(shù)組。我的意思是,如果改變引用指向的數(shù) 組,將會(huì)受到volatile 的保護(hù),但是如果多個(gè)線程同時(shí)改變數(shù)組的 元素,volatile標(biāo)示符就不能起到之前的保護(hù)作用了。2)volatile能使得一個(gè)非原子操作變成原子操作嗎?一個(gè)典型的例子是在類中有一個(gè)long類型的成員變量。如果 你知道該成員變量會(huì)被多個(gè)線程訪問,如計(jì)數(shù)器、
2、價(jià)格等,你最好是 將其設(shè)置為volatile。為什么?因?yàn)镴ava中讀取long 類型變量不是原子的,需要分成兩步,如果一個(gè)線程正在修改該long變量的值,另一個(gè)線程可能只能看到該值的一半(前32位)。但是對(duì)一個(gè)volatile 型的long 或double變量的讀寫是原子。3)volatile修飾符的有過什么實(shí)踐?一種實(shí)踐是用volatile 修飾long和double變量,使其能 按原子類型來讀寫。double和long都是64位寬,因此對(duì)這兩種類 型的讀是分為兩部分的,第一次讀取第一個(gè)32位,然后再讀剩下的 32位,這個(gè)過程不是原子的,但 Java中volatile 型的long 或 d
3、ouble變量的讀寫是原子的。volatile修復(fù)符的另一個(gè)作用是提供內(nèi)存屏障(memorybarrier),例如在分布式框架中的應(yīng)用。簡單的說, 就是當(dāng)你寫一個(gè)volatile變量之前,Java內(nèi)存模型會(huì)插入一個(gè)寫屏障(write barrier) ,讀一個(gè)volatile變量之前,會(huì)插入一個(gè)讀屏障(read barrier)。意思就是說,在你寫一個(gè) volatile 域時(shí),能 保證任何線程都能看到你寫的值,同時(shí),在寫之前,也能保證任何數(shù) 值的更新對(duì)所有線程是可見的,因?yàn)閮?nèi)存屏障會(huì)將其他所有寫的值更 新到緩存。4)volatile類型變量提供什么保證?volatile變量提供順序和可見性保證
4、,例如,JVM或者JIT為了獲得更好的性能會(huì)對(duì)語句重排序,但是volatile類型變量即使在沒有同步塊的情況下賦值也不會(huì)與其他語句重排序volatile 提供happens-before的保證,確保一個(gè)線程的修改能對(duì)其他線程是可見的。某些情況下,volatile還能提供原子性,如讀64位數(shù)據(jù)類型,像long 和double 都不是原子的,但volatile 類型的double 和10ng就是原子的。5) 你是如何調(diào)用wait()方法的?使用if 塊還是循環(huán)?為什么?wait()方法應(yīng)該在循環(huán)調(diào)用,因?yàn)楫?dāng)線程獲取到CPU開始執(zhí)行的時(shí)候,其他條件可能還沒有滿足,所以在處理前,循環(huán)檢測條件 是否滿足
5、會(huì)更好。下面是一段標(biāo)準(zhǔn)的使用 wait和notify方法的代碼:/ The standard idiom for using the wait methodsynchronized (obj) while (condition does not hold)obj.wait(); / (Releases lock, and reacquires on wakeup) Perform action appropriate to condition6) 什么是多線程環(huán)境下的偽共享(false sharing)?偽共享是多線程系統(tǒng)(每個(gè)處理器有自己的局部緩存)中一個(gè)眾 所周知的性能問題。偽共享發(fā)生在不
6、同處理器的上的線程對(duì)變量的修 改依賴于相同的緩存行,如下圖所示:7) 什么是Busy spin?我們?yōu)槭裁匆褂盟??Busy spin是一種在不釋放CPU的基礎(chǔ)上等待事件的技術(shù)。它 經(jīng)常用于避免丟失CPU緩存中的數(shù)據(jù)(如果線程先暫停,之后在其他 CPU1運(yùn)行就會(huì)丟失)。所以,如果你的工作要求低延遲,并且你的 線程目前沒有任何順序,這樣你就可以通過循環(huán)檢測隊(duì)列中的新消息 來代替調(diào)用sleep() 或wait() 方法。它唯一的好處就是你只需等 待很短的時(shí)間,如幾微秒或幾納秒。LMAX分布式框架是一個(gè)高性能 線程間通信的庫,該庫有一個(gè)BusySpinWaitStrategy類就是基于這個(gè)概念實(shí)現(xiàn)的
7、,使用busy spin 循環(huán)EventProcessors 等待屏障。8) 什么是線程局部變量?線程局部變量是局限于線程內(nèi)部的變量,屬于線程自身所有, 不在多個(gè)線程間共享。Java提供ThreadLocal類來支持線程局部變 量,是一種實(shí)現(xiàn)線程安全的方式。但是在管理環(huán)境下(如web服務(wù)器) 使用線程局部變量的時(shí)候要特別小心, 在這種情況下,工作線程的生 命周期比任何應(yīng)用變量的生命周期都要長。任何線程局部變量一旦在 工作完成后沒有釋放,Java應(yīng)用就存在內(nèi)存泄露的風(fēng)險(xiǎn)。9)Java 中sleep 方法和 wait 方法的區(qū)別?雖然兩者都是用來暫停當(dāng)前運(yùn)行的線程, 但是sleep() 實(shí)際上 只
8、是短暫停頓,因?yàn)樗粫?huì)釋放鎖,而 wait() 意味著條件等待,這 就是為什么該方法要釋放鎖,因?yàn)橹挥羞@樣,其他等待的線程才能在 滿足條件時(shí)獲取到該鎖。10) 什么是不可變對(duì)象(immutable object)?Java中怎么創(chuàng)建一個(gè)不可變對(duì)象?不可變對(duì)象指對(duì)象一旦被創(chuàng)建,狀態(tài)就不能再改變。任何修改 都會(huì)創(chuàng)建一個(gè)新的對(duì)象,如 String ,Integer及其它包裝類。11) 我們能創(chuàng)建一個(gè)包含可變對(duì)象的不可變對(duì)象嗎?是的,我們是可以創(chuàng)建一個(gè)包含可變對(duì)象的不可變對(duì)象的,你只需要謹(jǐn)慎一點(diǎn),不要共享可變對(duì)象的引用就可以了,如果需要變化時(shí),就返回原對(duì)象的一個(gè)拷貝。最常見的例子就是對(duì)象中包含一個(gè)日
9、期對(duì)象的引用。數(shù)據(jù)類型和Java基礎(chǔ)面試問題12)Java中應(yīng)該使用什么數(shù)據(jù)類型來代表價(jià)格?如果不是特別關(guān)心內(nèi)存和性能的話,使用BigDecimal ,否則使用預(yù)定義精度的double類型。13) 怎么將byte 轉(zhuǎn)換為String?可以使用String接收byte口參數(shù)的構(gòu)造器來進(jìn)行轉(zhuǎn)換,需要注意的點(diǎn)是要使用的正確的編碼,否則會(huì)使用平臺(tái)默認(rèn)編碼,這個(gè)編碼可能跟原來的編碼相同,也可能不同。14) 我們能將int強(qiáng)制轉(zhuǎn)換為byte類型的變量嗎?如果該值 大于byte類型的范圍,將會(huì)出現(xiàn)什么現(xiàn)象?是的,我們可以做強(qiáng)制轉(zhuǎn)換,但是Java中int 是32位的,而byte是8位的,所以,如果強(qiáng)制轉(zhuǎn)化是,
10、int類型的高24位 將會(huì)被丟棄,byte類型的范圍是從-128到12815)Java 中+操作符是線程安全的嗎?不是線程安全的操作。它涉及到多個(gè)指令,如讀取變量值,增加,然后存儲(chǔ)回內(nèi)存,這個(gè)過程可能會(huì)出現(xiàn)多個(gè)線程交差。16)a = a + b 與 a += b 的區(qū)別?+=隱式的將加操作的結(jié)果類型強(qiáng)制轉(zhuǎn)換為持有結(jié)果的類型。如果兩這個(gè)整型相加,如byte、short或者int ,首先會(huì)將它們提升 到int類型,然后在執(zhí)行加法操作。如果加法操作的結(jié)果比a的最 大值要大,則a+b會(huì)出現(xiàn)編譯錯(cuò)誤,但是a += b沒問題,如下:byte a = 127;byte b = 127;b = a + b;
11、/ error : cannot convert from int to byteb += a; / ok注:其實(shí)無論a+b的值為多少,編譯器都會(huì)報(bào)錯(cuò),因?yàn)閍+b操 作會(huì)將a、b提升為int類型,所以將int類型賦值給byte就會(huì) 編譯出錯(cuò)17)我能在不進(jìn)行強(qiáng)制轉(zhuǎn)換的情況下將一個(gè)double值賦值給long類型的變量嗎?不行,你不能在沒有強(qiáng)制類型轉(zhuǎn)換的前提下將一個(gè) double值 賦值給long類型的變量,因?yàn)閐ouble類型的范圍比long類型更 廣,所以必須要進(jìn)行強(qiáng)制轉(zhuǎn)換。18)3*0.1 = 0.3 將會(huì)返回什么?true 還是false?false ,因?yàn)橛行└↑c(diǎn)數(shù)不能完全精確的表示出
12、來。19)int 和Integer哪個(gè)會(huì)占用更多的內(nèi)存?Integer對(duì)象會(huì)占用更多的內(nèi)存。Integer是一個(gè)對(duì)象,需要存儲(chǔ)對(duì)象的元數(shù)據(jù)。但是int是一個(gè)原始類型的數(shù)據(jù),所以占用的 空間更少。20) 為什么Java中的String 是不可變的(Immutable)?Java 中的String不可變是因?yàn)镴ava的設(shè)計(jì)者認(rèn)為字符串使用非常頻繁,將字符串設(shè)置為不可變可以允許多個(gè)客戶端之間共享 相同的字符串。21)Java中的構(gòu)造器鏈?zhǔn)鞘裁???dāng)你從一個(gè)構(gòu)造器中調(diào)用另一個(gè)構(gòu)造器,就是 Java中的構(gòu)造 器鏈。這種情況只在重載了類的構(gòu)造器的時(shí)候才會(huì)出現(xiàn)。JVM 底層與GC(Garbage Collec
13、tion)的面試問題22)64 位JVM中,int 的長度是多數(shù)?Java 中,int類型變量的長度是一個(gè)固定值,與平臺(tái)無關(guān),都 是32位。意思就是說,在32位和64位 的Java虛擬機(jī)中,int 類型的長度是相同的。23)Serial 與Parallel GC 之間的不同之處?Serial 與Parallel在GCft行的時(shí)候都會(huì)引起stop-the-world 。它們之間主要不同serial收集器是默認(rèn)的復(fù)制收集器,執(zhí)行GC的時(shí)候只有一個(gè)線程,而parallel收集器使用多個(gè)GC線程來執(zhí)行。24)32 位和64位的JVM, int類型變量的長度是多數(shù)?32 位和64位的JVM中,int類型
14、變量的長度是相同的,者B 是32位或者4個(gè)字節(jié)。25)Java 中 WeakReference 與 SoftReference 的區(qū)別?雖然WeakReference與SoftReference 都有利于提高GC和 內(nèi)存的效率,但是 WeakReference , 一旦失去最后一個(gè)強(qiáng)引用,就 會(huì)被GC回收,而軟引用雖然不能阻止被回收, 但是可以延遲到JVM 內(nèi)存不足的時(shí)候。26)WeakHashMap 是怎么工作的WeakHashMap的工作與正常的HashMap類似,但是使用弱引用作為key ,意思就是當(dāng)key對(duì)象沒有任何引用時(shí),key/value 將會(huì) 被回收。27)JVM 選項(xiàng)-XX:+
15、UseCompressedOops有什么作用?為什么要 使用?當(dāng)你將你的應(yīng)用從32位的JVM遷移到64位的JVM時(shí),由 于對(duì)象的指針從32位增加到了 64位,因此堆內(nèi)存會(huì)突然增加,差 不多要翻倍。這也會(huì)對(duì) CPU緩存(容量比內(nèi)存小很多)的數(shù)據(jù)產(chǎn)生不 利。因?yàn)?,遷移到64位的JVM主要?jiǎng)訖C(jī)在于可以指定最大堆 大小,通過壓縮OOP可以節(jié)省一定的內(nèi)存。通過 -XX:+UseCompressedOops選項(xiàng),JVM 會(huì)使用 32 位的 OOP 而不是 64位的OOP28) 怎樣通過Java程序來判斷JVM是32位還是64位?你可以檢查某些系統(tǒng)屬性如 sun.arch.data.model 或 os.a
16、rch 來獲取該信息。29)32 位JVM和64位JVM的最大堆內(nèi)存分別是多數(shù)?理論上說上32位的JVM堆內(nèi)存可以到達(dá)2八32 ,即4GB,但 實(shí)際上會(huì)比這個(gè)小很多。不同操作系統(tǒng)之間不同,如 Windows系統(tǒng) 大約1.5 GB , Solaris 大約3GB。64位JVM允許指定最大的堆內(nèi) 存,理論上可以達(dá)到2八64 ,這是一個(gè)非常大的數(shù)字,實(shí)際上你可以指定堆內(nèi)存大小到100GR甚至有的JVM,如Azul ,堆內(nèi)存到1000G 都是可能的。30)JRE 、JDK JVM及JIT 之間有什么不同?JRE 代表Java運(yùn)行時(shí)(Java run-time),是運(yùn)行Java引用所 必須的。JDK 代
17、表 Java 開發(fā)工具(Javadevelopment kit),是 Java 程序的開發(fā)工具,如Java編譯器,它也包含JRE。JVM代表Java虛 擬機(jī)(Javavirtual machine),它的責(zé)任是運(yùn)行Java應(yīng)用。JIT代 表即時(shí)編譯(Just In Time pilation) ,當(dāng)代碼執(zhí)行的次數(shù)超過一定 的閾值時(shí),會(huì)將Java字節(jié)碼轉(zhuǎn)換為本地代碼,如,主要的熱點(diǎn)代碼 會(huì)被準(zhǔn)換為本地代碼,這樣有利大幅度提高Java應(yīng)用的性能。31) 解釋Java堆空間及GC?當(dāng)通過Java命令啟動(dòng)Java進(jìn)程的時(shí)候,會(huì)為它分配內(nèi)存。 內(nèi)存的一部分用于創(chuàng)建堆空間,當(dāng)程序中創(chuàng)建對(duì)象的時(shí)候,就從對(duì)空
18、 間中分配內(nèi)存。GC是JVM內(nèi)部的一個(gè)進(jìn)程,回收無效對(duì)象的內(nèi)存用 于將來的分配。32) 你能保證GC執(zhí)行嗎?不能,雖然你可以調(diào)用System.gc() 或者Runtime.gc(),但 是沒有辦法保證GC的執(zhí)行。33) 怎么獲取Java程序使用的內(nèi)存?堆使用的百分比?可以通過java.lang.Runtime類中與內(nèi)存相關(guān)方法來獲取剩余的內(nèi)存,總內(nèi)存及最大堆內(nèi)存。通過這些方法你也可以獲取到堆使 用的百分比及堆內(nèi)存的剩余空間。 Runtime.freeMemory() 方法返回 剩余空間的字節(jié)數(shù),Runtime.totalMemory() 方法總內(nèi)存的字節(jié)數(shù), Runtime.maxMemory
19、()返回最大內(nèi)存的字節(jié)數(shù)。34)Java 中堆和棧有什么區(qū)別?JVM 中堆和棧屬于不同的內(nèi)存區(qū)域,使用目的也不同。棧常用 于保存方法幀和局部變量,而對(duì)象總是在堆上分配。棧通常都比堆小, 也不會(huì)在多個(gè)線程之間共享,而堆被整個(gè)JVM的所有線程共享。Java基本概念面試題35)“a=b" 和" a.equals(b) ” 有什么區(qū)別?如果a和b都是對(duì)象,則a=b是比較兩個(gè)對(duì)象的引用,只 有當(dāng)a和b指向的是堆中的同一個(gè)對(duì)象才會(huì)返回true ,而 a.equals(b) 是進(jìn)行邏輯比較,所以通常需要重寫該方法來提供邏輯 一致性的比較。例如,String類重寫equals() 方法,所
20、以可以用 于兩個(gè)不同對(duì)象,但是包含的字母相同的比較。36)a.hashCode()有什么用?與a.equals(b)有什么關(guān)系?hashCode() 方法是相應(yīng)對(duì)象整型的hash值。它常用于基于 hash 的集合類,如 Hashtable、HashMap LinkedHashMap等等。它 與equals() 方法關(guān)系特別緊密。根據(jù)Java規(guī)范,兩個(gè)使用equal() 方法來判斷相等的對(duì)象,必須具有相同的hash code 。37)final 、finalize 和 finally 的不同之處final是一個(gè)修飾符,可以修飾變量、方法和類。如果final 修飾變量,意味著該變量的值在初始化后不
21、能被改變。finalize 方法是在對(duì)象被回收之前調(diào)用的方法,給對(duì)象自己最后一個(gè)復(fù)活的機(jī)會(huì), 但是什么時(shí)候調(diào)用finalize沒有保證。finally是一個(gè)關(guān)鍵字,與try和catch 一起用于異常的處理。finally塊一定會(huì)被執(zhí)行,無論在try 塊中是否有發(fā)生異常。38)Java中的編譯期常量是什么?使用它又什么風(fēng)險(xiǎn)?公共靜態(tài)不可變(public static final )變量也就是我們所說的編譯期常量,這里的public 可選的。實(shí)際上這些變量在編譯時(shí)會(huì) 被替換掉,因?yàn)榫幾g器知道這些變量的值,并且知道這些變量在運(yùn)行 時(shí)不能改變。這種方式存在的一個(gè)問題是你使用了一個(gè)內(nèi)部的或第三 方庫中的
22、公有編譯時(shí)常量,但是這個(gè)值后面被其他人改變了,但是你的客戶端仍然在使用老的值,甚至你已經(jīng)部署了一個(gè)新的jar。為了避免這種情況,當(dāng)你在更新依賴 JAR文件時(shí),確保重新編譯你的程 序。Java集合框架的面試題39) List 、Set、Map 和 Queue 之間的區(qū)別?List是一個(gè)有序集合,允許元素重復(fù)。它的某些實(shí)現(xiàn)可以提供基于下標(biāo)值的常量訪問時(shí)間,但是這不是List 接口保證的。Set是 一個(gè)無序集合。40)poll()方法和remove()方法的區(qū)別?poll()和remove()都是從隊(duì)列中取出一個(gè)元素,但是poll()在獲取元素失敗的時(shí)候會(huì)返回空,但是remove()失敗的時(shí)候會(huì)拋出
23、 異常。41)Java 中 LinkedHashMap 和 PriorityQueue的區(qū)別是什么?PriorityQueue保證最高或者最低優(yōu)先級(jí)的的元素總是在隊(duì)列頭部,但是LinkedHashMap維持的順序是元素插入的順序。當(dāng)遍歷 一個(gè)PriorityQueue 時(shí),沒有任何順序保證,但是 LinkedHashMap 課保證遍歷順序是元素插入的順序。42)ArrayList 與 LinkedList 的不區(qū)別?最明顯的區(qū)別是ArrrayList 底層的數(shù)據(jù)結(jié)構(gòu)是數(shù)組,支持隨 機(jī)訪問,而LinkedList的底層數(shù)據(jù)結(jié)構(gòu)書鏈表,不支持隨機(jī)訪問。使用下標(biāo)訪問一個(gè)元素,ArrayList的時(shí)間
24、復(fù)雜度是O(1),而LinkedList 是 O(n)。43)用哪兩種方式來實(shí)現(xiàn)集合的排序?你可以使用有序集合,如TreeSet或TreeMap,你也可以使用 有順序的的集合,如list ,然后通過Collections.sort() 來排序。44)Java 中怎么打印數(shù)組?你可以使用 Arrays.toString() 和 Arrays.deepToString()方法來打印數(shù)組。由于數(shù)組沒有實(shí)現(xiàn)toString() 方法,所以如果將 數(shù)組傳遞給System.out.println() 方法,將無法打印出數(shù)組的內(nèi)容, 但是Arrays.toString()可以打印每個(gè)元素。45) Hasht
25、able 與HashMap有什么不同之處?這兩個(gè)類有許多不同的地方,下面列出了一部分:a) Hashtable是JDK 1遺留下來的類,而 HashMap是后來增 加的。b)Hashtable 是同步的,比較慢,但 HashMap沒有同步策略, 所以會(huì)更快。不允許有個(gè)空的key ,但是HashMap允許出現(xiàn)一c)Hashtable個(gè) null key46)Java 中的HashSet,內(nèi)部是如何工作的HashSet的內(nèi)部采用HashMap來實(shí)現(xiàn)。由于Map需要key和value ,所以所有key的都有一個(gè)默認(rèn)value 。類似于HashMap, HashSet不允許重復(fù)的key ,只允許有一個(gè)
26、null key ,意思就是 HashSet中只允許存儲(chǔ)一個(gè) null 對(duì)象。47) 寫一段代碼在遍歷ArrayList時(shí)移除一個(gè)元素?該問題的關(guān)鍵在于面試者使用的是ArrayList 的remove()還是Iterator 的remove()方法。這有一段示例代碼,是使用正確 的方式來實(shí)現(xiàn)在遍歷的過程中移除元素,而不會(huì)出現(xiàn) ConcurrentModificationException異常的示例代碼。48) 我們能自己寫一個(gè)容器類,然后使用for-each循環(huán)碼?可以,你可以寫一個(gè)自己的容器類。如果你想使用Java中增強(qiáng)的循環(huán)來遍歷,你只需要實(shí)現(xiàn)Iterable 接口。如果你實(shí)現(xiàn) Colle
27、ction 接口,默認(rèn)就具有該屬性。49)ArrayList和HashMap的默認(rèn)大小是多數(shù)?在Java 7中,ArrayList的默認(rèn)大小是10個(gè)元素,HashMap的默認(rèn)大小是16個(gè)元素(必須是2的哥)。這就是Java 7中 ArrayList 和HashMap類的代碼片段:/ from ArrayList.java JDK 1.7private static final int DEFAULT_CAPACITY = 10;/from HashMap.java JDK 7static final int DEFAULT_INITIAL_CAPACITY1 << 4; / aka
28、 1650) 有沒有可能兩個(gè)不相等的對(duì)象有有相同的hashcode?有可能,兩個(gè)不相等的對(duì)象可能會(huì)有相同的 hashcode值,這 就是為什么在hashmap中會(huì)有沖突。相等hashcode值的規(guī)定只是 說如果兩個(gè)對(duì)象相等,必須有相同的 hashcode值,但是沒有關(guān)于不 相等對(duì)象的任何規(guī)定。51) 兩個(gè)相同的對(duì)象會(huì)有不同的的 hash code 嗎?不能,根據(jù)hash code的規(guī)定,這是不可能的52) 我們可以在hashcode()中使用隨機(jī)數(shù)字嗎?不行,因?yàn)閷?duì)象的hashcode值必須是相同的。參見答案獲取 更多關(guān)于Java中重寫hashCode()方法的知識(shí)。53)Java 中,Com
29、parator 與 Comparable 有什么不同?Comparable接口用于定義對(duì)象的自然順序,而 parator 通常用于定義用戶定制的順序。Comparable總是只有一個(gè),但是可以有 多個(gè)parator 來定義對(duì)象的順序。54) 為什么在重寫equals方法的時(shí)候需要重寫hashCode方 法?因?yàn)橛袕?qiáng)制的規(guī)范指定需要同時(shí)重寫 hashcode與equal是 方法,許多容器類,如 HashMap HashSet都依賴于hashcode與 equals 的規(guī)定。Java最佳實(shí)踐的面試問題55)Java 中,編寫多線程程序的時(shí)候你會(huì)遵循哪些最佳實(shí)踐a) 給線程命名,這樣可以幫助調(diào)試。b
30、) 最小化同步的范圍,而不是將整個(gè)方法同步,只對(duì)關(guān)鍵部分做同步。c) 如果可以,更偏向于使用 volatile 而不是synchronized 。d) 使用更高層次的并發(fā)工具,而不是使用wait() 和notify()來實(shí)現(xiàn)線程間通信,如 BlockingQueue , CountDownLatch及 Semeaphoree) 優(yōu)先使用并發(fā)集合,而不是對(duì)集合進(jìn)行同步。并發(fā)集合提供更好的可擴(kuò)展性。56) 說出幾點(diǎn)Java中使用Collections 的最佳實(shí)踐?a) 使用正確的集合類,例如,如果不需要同步列表,使用ArrayList 而不是 Vector。b) 優(yōu)先使用并發(fā)集合,而不是對(duì)集合進(jìn)行
31、同步。并發(fā)集合提供更好的可擴(kuò)展性。c) 使用接口代表和訪問集合,如使用List存儲(chǔ)ArrayList ,使用Map存儲(chǔ)HashMap等等。d) 使用迭代器來循環(huán)集合。e) 使用集合的時(shí)候使用泛型。57) 說出在Java中使用線程的最佳實(shí)踐?a) 對(duì)線程命名b) 將線程和任務(wù)分離,使用線程池執(zhí)行器來執(zhí)行Runnable或Callable。c) 使用線程池58) 說出IO的最佳實(shí)踐?a) 使用有緩沖區(qū)的IO類,而不要單獨(dú)讀取字節(jié)或字符b) 使用NIO和NIO2c) 在finally 塊中關(guān)閉流,或者使用 try-with-resource 語 句。d) 使用內(nèi)存映射文件獲取更快的IO。59) 列出
32、應(yīng)該遵循的JDBC最佳實(shí)踐?a) 使用批量的操作來插入和更新數(shù)據(jù)b) 使用PreparedStatement 來避免SQL異常,并提高性能。c) 使用數(shù)據(jù)庫連接池d) 通過列名來獲取結(jié)果集,不要使用列的下標(biāo)來獲取。60) 說出幾條Java中方法重載的最佳實(shí)踐?a) 不要重載這樣的方法:一個(gè)方法接收int參數(shù),而另個(gè)方法接收Integer 參數(shù)。b) 不要重載參數(shù)數(shù)量一致,而只是參數(shù)順序不同的方法。c) 如果重載的方法參數(shù)個(gè)數(shù)多于 5個(gè),采用可變參數(shù)。Date 、Time 及 Calendar 的面試題61) 在多線程環(huán)境下,SimpleDateFormat是線程安全的嗎?不是,非常不幸,Dat
33、eFormat的所有實(shí)現(xiàn),包括 SimpleDateFormat都不是線程安全的,因此你不應(yīng)該在多線程序中 使用,除非是在對(duì)外線程安全的環(huán)境中使用,如 將 SimpleDateFormat限制在ThreadLocal中。如果你不這么做,在解 析或者格式化日期的時(shí)候,可能會(huì)獲取到一個(gè)不正確的結(jié)果。因此, 從日期、時(shí)間處理的所有實(shí)踐來說,我強(qiáng)力推薦 joda-time 庫。62)Java中如何格式化一個(gè)日期?如格式化為ddMMyyyy的形式?Java 中,可以使用 SimpleDateFormat 類或者 joda-time 庫 來格式日期。DateFormat類允許你使用多種流行的格式來格式化日
34、 期。參見答案中的示例代碼,代碼中演示了將日期格式化成不同的格 式,如 dd-MM-yyyy 或 ddMMyyyy關(guān)于OOP和設(shè)計(jì)模式的面試題63) 接口是什么?為什么要使用接口而不是直接使用具體類 ?接口用于定義API。它定義了類必須得遵循的規(guī)則。同時(shí),它 提供了一種抽象,因?yàn)榭蛻舳酥皇褂媒涌?,這樣可以有多重實(shí)現(xiàn),如 List接口,你可以使用可隨機(jī)訪問的 ArrayList ,也可以使用方便 插入和刪除的LinkedList 。接口中不允許寫代碼,以此來保證抽象, 但是Java 8中你可以在接口聲明靜態(tài)的默認(rèn)方法,這種方法是具體 的。64)Java 中,抽象類與接口之間有什么不同?Java
35、中,抽象類和接口有很多不同之處,但是最重要的一個(gè)是 Java中限制一個(gè)類只能繼承一個(gè)類,但是可以實(shí)現(xiàn)多個(gè)接口。抽象 類可以很好的定義一個(gè)家族類的默認(rèn)行為,而接口能更好的定義類型,有助于后面實(shí)現(xiàn)多態(tài)機(jī)制。關(guān)于這個(gè)問題的討論請(qǐng)查看答案。65) 除了單例模式,你在生產(chǎn)環(huán)境中還用過什么設(shè)計(jì)模式?這需要根據(jù)你的經(jīng)驗(yàn)來回答。一般情況下,你可以說依賴注入, 工廠模式,裝飾模式或者觀察者模式,隨意選擇你使用過的一種即可。 不過你要準(zhǔn)備回答接下的基于你選擇的模式的問題。66) 適配器模式是什么?什么時(shí)彳g使用?適配器模式提供對(duì)接口的轉(zhuǎn)換。如果你的客戶端使用某些接口, 但是你有另外一些接口,你就可以寫一個(gè)適配去來
36、連接這些接口。67) 構(gòu)造器注入和setter 依賴注入,那種方式更好?每種方式都有它的缺點(diǎn)和優(yōu)點(diǎn)。構(gòu)造器注入保證所有的注入都 被初始化,但是setter 注入提供更好的靈活性來設(shè)置可選依賴。 如 果使用XML來描述依賴,Setter注入的可讀寫會(huì)更強(qiáng)。經(jīng)驗(yàn)法則是 強(qiáng)制依賴使用構(gòu)造器注入,可選依賴使用 setter 注入。68) 依賴注入和工程模式之間有什么不同?雖然兩種模式都是將對(duì)象的創(chuàng)建從應(yīng)用的邏輯中分離,但是依賴注入比工程模式更清晰。通過依賴注入,你的類就是POJQ它只知道依賴而不關(guān)心它們怎么獲取。 使用工廠模式,你的類需要通過工 廠來獲取依賴。因此,使用 DI會(huì)比使用工廠模式更容易測試。69) 適配器模式和裝飾器模式有什么區(qū)別?雖然適配器模式和裝飾器模式的結(jié)構(gòu)類似,但是每種模式的出 現(xiàn)意圖不同。適配器模式被用于橋接兩個(gè)接口, 而裝飾模式的目的是 在不修改類的情況下給類增加新的功能。70) 適配器模式和代理模式之前有什么不同 ?這個(gè)問題與前面的類似,適配器模式和代理模式的區(qū)別在于他 們的意圖不同。由于適配器模
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 治療計(jì)劃的設(shè)計(jì)與實(shí)施過程
- 艾滋病培訓(xùn)課程
- 乳房再造課件教學(xué)課件
- 幼兒園成長檔案
- 狂犬病健康教案
- 氟哌啶醇藥物治療護(hù)理
- 脫稿蝴蝶課件教學(xué)課件
- 3.1.1 鹽類的水解 課件 高二上學(xué)期化學(xué)人教版(2019)選擇性必修1
- 醫(yī)院感染流行病學(xué)
- 致心律失常型右室心肌病
- 2024年高等教育法學(xué)類自考-00262法律文書寫作考試近5年真題附答案
- 北京市人民大學(xué)附屬中學(xué)2025屆數(shù)學(xué)高二上期末統(tǒng)考模擬試題含解析
- 萬達(dá)入職在線測評(píng)題
- 2024年醫(yī)務(wù)科工作總結(jié)標(biāo)準(zhǔn)范本(二篇)
- “一老一小”服務(wù)體系協(xié)同高質(zhì)量發(fā)展對(duì)策研究
- 《白描人物摹神韻》 課件 2024-2025學(xué)年嶺南美版(2024) 初中美術(shù)七年級(jí)上冊
- 2024年浙江省寧波市鄞州中學(xué)強(qiáng)基招生數(shù)學(xué)試題
- 2024年全國職業(yè)院校技能大賽高職組(藥學(xué)技能賽項(xiàng))考試題庫(含答案)
- 2024至2030年中國羽毛球行業(yè)發(fā)展現(xiàn)狀及投資趨勢研究報(bào)告
- 儲(chǔ)能電池?zé)崾Э鼗馂?zāi)演化機(jī)制及防控
- 2024年公司市場化選聘經(jīng)理層考核管理辦法
評(píng)論
0/150
提交評(píng)論