java面試總結(jié)報(bào)告_第1頁
java面試總結(jié)報(bào)告_第2頁
java面試總結(jié)報(bào)告_第3頁
java面試總結(jié)報(bào)告_第4頁
java面試總結(jié)報(bào)告_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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ù)器、價(jià)格等,你最好是將其設(shè)置為volatile 。為什么?因?yàn)镴ava 中讀取long 類型變量不是原子的,需要分成兩步,如果一個(gè)線程正在修改該 long 變量的值,另一個(gè)線程可能只能看到該值的一半 (前32位)。但是對一個(gè)volatile 型的long 或double 變量的讀寫是原子。3)volatile 修飾符的有過什么實(shí)踐?一種實(shí)踐是用

volatile

修飾

long

double

變量,使其能按原子類型來讀寫。

double

long

都是

64位寬,因此對這兩種類型的讀是分為兩部分的,第一次讀取第一個(gè) 32位,然后再讀剩下的32位,這個(gè)過程不是原子的,但

Java

volatile

型的

long

或double

變量的讀寫是原子的。

volatile

修復(fù)符的另一個(gè)作用是提供內(nèi)存屏障(memorybarrier) ,例如在分布式框架中的應(yīng)用。簡單的說,就是當(dāng)你寫一個(gè)

volatile

變量之前,

Java

內(nèi)存模型會(huì)插入一個(gè)寫屏障(writebarrier),讀一個(gè)volatile變量之前,會(huì)插入一個(gè)讀屏障(readbarrier)。意思就是說,在你寫一個(gè)volatile域時(shí),能保證任何線程都能看到你寫的值,同時(shí),在寫之前,也能保證任何數(shù)值的更新對所有線程是可見的,因?yàn)閮?nèi)存屏障會(huì)將其他所有寫的值更新到緩存。4)volatile 類型變量提供什么保證?volatile 變量提供順序和可見性保證,例如,為了獲得更好的性能會(huì)對語句重排序, 但是volatile

JVM或者JIT類型變量即使在沒有同步塊的情況下賦值也不會(huì)與其他語句重排序。 volatile 提供happens-before的保證,確保一個(gè)線程的修改能對其他線程是可見的。某些情況下,volatile還能提供原子性,如讀64位數(shù)據(jù)類型,像long 和double 都不是原子的,但volatile 類型的double和long就是原子的。你是如何調(diào)用wait()方法的?使用if塊還是循環(huán)?為什么?wait() 方法應(yīng)該在循環(huán)調(diào)用,因?yàn)楫?dāng)線程獲取到 CPU開始執(zhí)行的時(shí)候,其他條件可能還沒有滿足,所以在處理前,循環(huán)檢測條件是否滿足會(huì)更好。下面是一段標(biāo)準(zhǔn)的使用 wait 和notify 方法的代碼:Thestandardidiomforusingthewaitmethodsynchronized(obj){while(conditiondoesnothold)obj.wait(); // (Releases lock,and reacquires onwakeup)...//Performactionappropriatetocondition}什么是多線程環(huán)境下的偽共享(falsesharing)?偽共享是多線程系統(tǒng)(每個(gè)處理器有自己的局部緩存)中一個(gè)眾所周知的性能問題。偽共享發(fā)生在不同處理器的上的線程對變量的修改依賴于相同的緩存行,如下圖所示:什么是Busyspin?我們?yōu)槭裁匆褂盟?Busy spin 是一種在不釋放 CPU的基礎(chǔ)上等待事件的技術(shù)。它經(jīng)常用于避免丟失CPU緩存中的數(shù)據(jù)(如果線程先暫停,之后在其他CPU上運(yùn)行就會(huì)丟失)。所以,如果你的工作要求低延遲,并且你的線程目前沒有任何順序,這樣你就可以通過循環(huán)檢測隊(duì)列中的新消息來代替調(diào)用sleep()或wait()方法。它唯一的好處就是你只需等待很短的時(shí)間,如幾微秒或幾納秒。LMAX分布式框架是一個(gè)高性能線程間通信的庫,該庫有一個(gè)BusySpinWaitStrategy類就是基于這個(gè)概念實(shí)現(xiàn)的,使用busyspin循環(huán)EventProcessors等待屏障。什么是線程局部變量?線程局部變量是局限于線程內(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í)際上只是短暫停頓,因?yàn)樗粫?huì)釋放鎖,而wait()意味著條件等待,這就是為什么該方法要釋放鎖,因?yàn)橹挥羞@樣,其他等待的線程才能在滿足條件時(shí)獲取到該鎖。10) 什么是不可變對象(immutableobject)?Java 中怎么創(chuàng)建一個(gè)不可變對象?不可變對象指對象一旦被創(chuàng)建,狀態(tài)就不能再改變。任何修改都會(huì)創(chuàng)建一個(gè)新的對象,如String、Integer及其它包裝類。我們能創(chuàng)建一個(gè)包含可變對象的不可變對象嗎?是的,我們是可以創(chuàng)建一個(gè)包含可變對象的不可變對象的,你只需要謹(jǐn)慎一點(diǎn),不要共享可變對象的引用就可以了, 如果需要變化時(shí),就返回原對象的一個(gè)拷貝。最常見的例子就是對象中包含一個(gè)日期對象的引用。數(shù)據(jù)類型和Java 基礎(chǔ)面試問題12)Java 中應(yīng)該使用什么數(shù)據(jù)類型來代表價(jià)格 ?如果不是特別關(guān)心內(nèi)存和性能的話,使用 BigDecimal,否則使用預(yù)定義精度的 double 類型。怎么將byte轉(zhuǎn)換為String?可以使用String接收byte[]參數(shù)的構(gòu)造器來進(jìn)行轉(zhuǎn)換,需要注意的點(diǎn)是要使用的正確的編碼,否則會(huì)使用平臺(tái)默認(rèn)編碼,這個(gè)編碼可能跟原來的編碼相同,也可能不同。我們能將int強(qiáng)制轉(zhuǎn)換為byte類型的變量嗎?如果該值大于byte類型的范圍,將會(huì)出現(xiàn)什么現(xiàn)象?而

是的,我們可以做強(qiáng)制轉(zhuǎn)換,但是 Javabyte 是8位的,所以,如果強(qiáng)制轉(zhuǎn)化是,

中int

int是32類型的高

位的,24位將會(huì)被丟棄,

byte

類型的范圍是從

-128

到128。15)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沒問題,如下:bytea=127;byteb=127;b=a+b;//error:cannotconvertfrominttobyteb+=a;//ok注:其實(shí)無論a+b的值為多少,編譯器都會(huì)報(bào)錯(cuò),因?yàn)閍+b操作會(huì)將a、b提升為int 類型,所以將int 類型賦值給byte 就會(huì)編譯出錯(cuò)我能在不進(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ù)不能完全精確的表示出來。19)int 和Integer 哪個(gè)會(huì)占用更多的內(nèi)存?Integer 對象會(huì)占用更多的內(nèi)存。 Integer 是一個(gè)對象,需要存儲(chǔ)對象的元數(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(GarbageCollection) 的面試問題22)64 位JVM中,int 的長度是多數(shù)?Java中,int類型變量的長度是一個(gè)固定值,與平臺(tái)無關(guān),都是32位。意思就是說,在32位和64位的Java虛擬機(jī)中,int類型的長度是相同的。23)Serial 與ParallelGC 之間的不同之處?Serialstop-the-world

Parallel 在GC執(zhí)行的時(shí)候都會(huì)引起。它們之間主要不同 serial 收集器是默認(rèn)的復(fù)制收集器,執(zhí)行GC的時(shí)候只有一個(gè)線程,而

parallel

收集器使用多個(gè)GC線程來執(zhí)行。24)32 位和64位的JVM,int 類型變量的長度是多數(shù)?32位和64位的JVM中,int類型變量的長度是相同的,都是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對象沒有任何引用時(shí),key/value將會(huì)被回收。27)JVM 選項(xiàng)-XX:+UseCompressedOops有什么作用?為什么要使用?當(dāng)你將你的應(yīng)用從 32位的JVM遷移到64位的JVM時(shí),由于對象的指針從 32位增加到了64位,因此堆內(nèi)存會(huì)突然增加,差不多要翻倍。這也會(huì)對 CPU緩存(容量比內(nèi)存小很多)的數(shù)據(jù)產(chǎn)生不利___。因?yàn)椋w移到64位的JVM主要?jiǎng)訖C(jī)在于可以指定最大堆大小,通過壓縮OOP可以節(jié)省一定的內(nèi)存。通過-XX:+UseCompressedOops選項(xiàng),JVM會(huì)使用32位的OOP,而不是64位的OOP。怎樣通過Java程序來判斷JVM是32位還是64位?你可以檢查某些系統(tǒng)屬性如 sun.arch.data.model 或os.arch 來獲取該信息。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.5GB,Solaris 大約3GB。64位JVM允許指定最大的堆內(nèi)存,理論上可以達(dá)到 2^64,這是一個(gè)非常大的數(shù)字,實(shí)際上你可以指定堆內(nèi)存大小到100GB。甚至有的JVM,如Azul,堆內(nèi)存到1000G都是可能的。30)JRE 、JDK、JVM及JIT 之間有什么不同?JRE 代表Java 運(yùn)行時(shí)(Javarun-time) ,是運(yùn)行Java 引用所必須的。JDK代表Java 開發(fā)工具(Javadevelopmentkit) ,是Java程序的開發(fā)工具,如Java 編譯器,它也包含JRE。JVM代表Java 虛擬機(jī)(Javavirtualmachine) ,它的責(zé)任是運(yùn)行 Java 應(yīng)用。JIT 代表即時(shí)編譯(JustInTimepilation) ,當(dāng)代碼執(zhí)行的次數(shù)超過一定的閾值時(shí),會(huì)將Java 字節(jié)碼轉(zhuǎn)換為本地代碼,如,主要的熱點(diǎn)代碼會(huì)被準(zhǔn)換為本地代碼,這樣有利大幅度提高 Java 應(yīng)用的性能。解釋Java堆空間及GC?當(dāng)通過Java命令啟動(dòng)Java進(jìn)程的時(shí)候,會(huì)為它分配內(nèi)存。內(nèi)存的一部分用于創(chuàng)建堆空間,當(dāng)程序中創(chuàng)建對象的時(shí)候,就從對空間中分配內(nèi)存。GC是JVM內(nèi)部的一個(gè)進(jìn)程,回收無效對象的內(nèi)存用于將來的分配。32) 你能保證GC執(zhí)行嗎?不能,雖然你可以調(diào)用 System.gc() 或者Runtime.gc() ,但是沒有辦法保證 GC的執(zhí)行。怎么獲取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()返回最大內(nèi)存的字節(jié)數(shù)。34)Java 中堆和棧有什么區(qū)別?JVM 中堆和棧屬于不同的內(nèi)存區(qū)域,使用目的也不同。棧常用于保存方法幀和局部變量,而對象總是在堆上分配。棧通常都比堆小,也不會(huì)在多個(gè)線程之間共享,而堆被整個(gè)JVM的所有線程共享。Java 基本概念面試題35) “a==b”和”a.equals(b) ”有什么區(qū)別?如果

a

b

都是對象,則

a==b

是比較兩個(gè)對象的引用,只有當(dāng)

a

b

指向的是堆中的同一個(gè)對象才會(huì)返回

true

,而a.equals(b)

是進(jìn)行邏輯比較,所以通常需要重寫該方法來提供邏輯一致性的比較。例如, String 類重寫equals() 方法,所以可以用于兩個(gè)不同對象,但是包含的字母相同的比較。36)a.hashCode() 有什么用?與a.equals(b) 有什么關(guān)系?hashCode()方法是相應(yīng)對象整型的hash值。它常用于基于hash的集合類,如Hashtable、HashMap、LinkedHashMap等等。它與equals()方法關(guān)系特別緊密。根據(jù)Java

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論