版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【培訓(xùn)課件】顧問式營銷技術(shù)探討
- 產(chǎn)后排尿困難的健康宣教
- 共點(diǎn)力作用下物體的平衡課件
- 孕期陰道炎的健康宣教
- 《論述類總復(fù)習(xí)》課件
- JJF(陜) 043-2020 非接觸式視頻引伸計(jì)校準(zhǔn)規(guī)范
- JJF(黔) 80-2024 經(jīng)皮黃疸測試儀校準(zhǔn)規(guī)范
- 【大學(xué)課件】網(wǎng)絡(luò)安全基礎(chǔ)
- 社會(huì)實(shí)踐活動(dòng)豐富教研內(nèi)容計(jì)劃
- 財(cái)務(wù)道德在職業(yè)中的重要性計(jì)劃
- 部門績效考核表模板
- DB33T 1210-2020 城市公共廁所建設(shè)與管理標(biāo)準(zhǔn)
- 《中藥化學(xué)》課件第十二章其他
- 青藍(lán)工程記錄冊【范本模板】
- 梁平法施工圖識(shí)讀(含工程案例)
- D502-15D502等電位聯(lián)結(jié)安裝圖集
- GA∕T 1702-2019 法庭科學(xué) 紙張檢驗(yàn) 染色劑法
- 冰銅主要性質(zhì)都有哪些呢
- 生物校本教材—生活中的生物科學(xué)
- 提高地下車庫防水層鋪設(shè)一次驗(yàn)收合格率(QC成果)
- 光伏并網(wǎng)逆變器調(diào)試報(bào)告(正式版)
評(píng)論
0/150
提交評(píng)論