




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
java面試總結(jié)報告java 面試總結(jié)報告java 面試總結(jié)報告怎么寫 ?下面是帶來的 java面試總結(jié)報告,歡迎閱讀!多線程、并發(fā)及線程的基礎(chǔ)問題:1)Java 中能創(chuàng)建volatile 數(shù)組嗎?能,Java中可以創(chuàng)建volatile 類型數(shù)組,不過只是一個指向數(shù)組的引用,而不是整個數(shù)組。我的意思是,如果改變引用指向的數(shù)組,將會受到volatile 的保護(hù),但是如果多個線程同時改變數(shù)組的元素,volatile 標(biāo)示符就不能起到之前的保護(hù)作用了。2)volatile 能使得一個非原子操作變成原子操作嗎 ?一個典型的例子是在類中有一個 long 類型的成員變量。如果你知道該成員變量會被多個線程訪問,如計數(shù)器、價格等,你最好是將其設(shè)置為volatile 。為什么?因?yàn)镴ava 中讀取long 類型變量不是原子的,需要分成兩步,如果一個線程正在修改該 long 變量的值,另一個線程可能只能看到該值的一半 (前32位)。但是對一個volatile 型的long 或double 變量的讀寫是原子。3)volatile 修飾符的有過什么實(shí)踐?一種實(shí)踐是用
volatile
修飾
long
和
double
變量,使其能按原子類型來讀寫。
double
和
long
都是
64位寬,因此對這兩種類型的讀是分為兩部分的,第一次讀取第一個 32位,然后再讀剩下的32位,這個過程不是原子的,但
Java
中
volatile
型的
long
或double
變量的讀寫是原子的。
volatile
修復(fù)符的另一個作用是提供內(nèi)存屏障(memorybarrier) ,例如在分布式框架中的應(yīng)用。簡單的說,就是當(dāng)你寫一個
volatile
變量之前,
Java
內(nèi)存模型會插入一個寫屏障(writebarrier),讀一個volatile變量之前,會插入一個讀屏障(readbarrier)。意思就是說,在你寫一個volatile域時,能保證任何線程都能看到你寫的值,同時,在寫之前,也能保證任何數(shù)值的更新對所有線程是可見的,因?yàn)閮?nèi)存屏障會將其他所有寫的值更新到緩存。4)volatile 類型變量提供什么保證?volatile 變量提供順序和可見性保證,例如,為了獲得更好的性能會對語句重排序, 但是volatile
JVM或者JIT類型變量即使在沒有同步塊的情況下賦值也不會與其他語句重排序。 volatile 提供happens-before的保證,確保一個線程的修改能對其他線程是可見的。某些情況下,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í)行的時候,其他條件可能還沒有滿足,所以在處理前,循環(huán)檢測條件是否滿足會更好。下面是一段標(biāo)準(zhǔn)的使用 wait 和notify 方法的代碼:Thestandardidiomforusingthewaitmethodsynchronized(obj){while(conditiondoesnothold)obj.wait(); // (Releases lock,and reacquires onwakeup)...//Performactionappropriatetocondition}什么是多線程環(huán)境下的偽共享(falsesharing)?偽共享是多線程系統(tǒng)(每個處理器有自己的局部緩存)中一個眾所周知的性能問題。偽共享發(fā)生在不同處理器的上的線程對變量的修改依賴于相同的緩存行,如下圖所示:什么是Busyspin?我們?yōu)槭裁匆褂盟?Busy spin 是一種在不釋放 CPU的基礎(chǔ)上等待事件的技術(shù)。它經(jīng)常用于避免丟失CPU緩存中的數(shù)據(jù)(如果線程先暫停,之后在其他CPU上運(yùn)行就會丟失)。所以,如果你的工作要求低延遲,并且你的線程目前沒有任何順序,這樣你就可以通過循環(huán)檢測隊列中的新消息來代替調(diào)用sleep()或wait()方法。它唯一的好處就是你只需等待很短的時間,如幾微秒或幾納秒。LMAX分布式框架是一個高性能線程間通信的庫,該庫有一個BusySpinWaitStrategy類就是基于這個概念實(shí)現(xiàn)的,使用busyspin循環(huán)EventProcessors等待屏障。什么是線程局部變量?線程局部變量是局限于線程內(nèi)部的變量,屬于線程自身所有,不在多個線程間共享。Java提供ThreadLocal 類來支持線程局部變量,是一種實(shí)現(xiàn)線程安全的方式。但是在管理環(huán)境下(如web服務(wù)器)使用線程局部變量的時候要特別小心,在這種情況下,工作線程的生命周期比任何應(yīng)用變量的生命周期都要長。任何線程局部變量一旦在工作完成后沒有釋放,Java應(yīng)用就存在內(nèi)存泄露的風(fēng)險。9)Java 中sleep 方法和wait 方法的區(qū)別?雖然兩者都是用來暫停當(dāng)前運(yùn)行的線程,但是sleep()實(shí)際上只是短暫停頓,因?yàn)樗粫尫沛i,而wait()意味著條件等待,這就是為什么該方法要釋放鎖,因?yàn)橹挥羞@樣,其他等待的線程才能在滿足條件時獲取到該鎖。10) 什么是不可變對象(immutableobject)?Java 中怎么創(chuàng)建一個不可變對象?不可變對象指對象一旦被創(chuàng)建,狀態(tài)就不能再改變。任何修改都會創(chuàng)建一個新的對象,如String、Integer及其它包裝類。我們能創(chuàng)建一個包含可變對象的不可變對象嗎?是的,我們是可以創(chuàng)建一個包含可變對象的不可變對象的,你只需要謹(jǐn)慎一點(diǎn),不要共享可變對象的引用就可以了, 如果需要變化時,就返回原對象的一個拷貝。最常見的例子就是對象中包含一個日期對象的引用。數(shù)據(jù)類型和Java 基礎(chǔ)面試問題12)Java 中應(yīng)該使用什么數(shù)據(jù)類型來代表價格 ?如果不是特別關(guān)心內(nèi)存和性能的話,使用 BigDecimal,否則使用預(yù)定義精度的 double 類型。怎么將byte轉(zhuǎn)換為String?可以使用String接收byte[]參數(shù)的構(gòu)造器來進(jìn)行轉(zhuǎn)換,需要注意的點(diǎn)是要使用的正確的編碼,否則會使用平臺默認(rèn)編碼,這個編碼可能跟原來的編碼相同,也可能不同。我們能將int強(qiáng)制轉(zhuǎn)換為byte類型的變量嗎?如果該值大于byte類型的范圍,將會出現(xiàn)什么現(xiàn)象?而
是的,我們可以做強(qiáng)制轉(zhuǎn)換,但是 Javabyte 是8位的,所以,如果強(qiáng)制轉(zhuǎn)化是,
中int
int是32類型的高
位的,24位將會被丟棄,
byte
類型的范圍是從
-128
到128。15)Java 中++操作符是線程安全的嗎?不是線程安全的操作。它涉及到多個指令,如讀取變量值,增加,然后存儲回內(nèi)存,這個過程可能會出現(xiàn)多個線程交差。16)a=a+b 與a+=b 的區(qū)別?+=隱式的將加操作的結(jié)果類型強(qiáng)制轉(zhuǎn)換為持有結(jié)果的類型。如果兩這個整型相加,如byte、short或者int,首先會將它們提升到int類型,然后在執(zhí)行加法操作。如果加法操作的結(jié)果比a的最大值要大,則a+b會出現(xiàn)編譯錯誤,但是a+=b沒問題,如下:bytea=127;byteb=127;b=a+b;//error:cannotconvertfrominttobyteb+=a;//ok注:其實(shí)無論a+b的值為多少,編譯器都會報錯,因?yàn)閍+b操作會將a、b提升為int 類型,所以將int 類型賦值給byte 就會編譯出錯我能在不進(jìn)行強(qiáng)制轉(zhuǎn)換的情況下將一個double值賦值給long 類型的變量嗎?不行,你不能在沒有強(qiáng)制類型轉(zhuǎn)換的前提下將一個double值賦值給long類型的變量,因?yàn)閐ouble類型的范圍比long類型更廣,所以必須要進(jìn)行強(qiáng)制轉(zhuǎn)換。18)3*0.1==0.3 將會返回什么?true 還是false?false ,因?yàn)橛行└↑c(diǎn)數(shù)不能完全精確的表示出來。19)int 和Integer 哪個會占用更多的內(nèi)存?Integer 對象會占用更多的內(nèi)存。 Integer 是一個對象,需要存儲對象的元數(shù)據(jù)。但是 int 是一個原始類型的數(shù)據(jù),所以占用的空間更少。20) 為什么Java 中的String 是不可變的(Immutable)?Java中的String不可變是因?yàn)镴ava的設(shè)計者認(rèn)為字符串使用非常頻繁,將字符串設(shè)置為不可變可以允許多個客戶端之間共享相同的字符串。21)Java 中的構(gòu)造器鏈?zhǔn)鞘裁?當(dāng)你從一個構(gòu)造器中調(diào)用另一個構(gòu)造器,就是Java中的構(gòu)造器鏈。這種情況只在重載了類的構(gòu)造器的時候才會出現(xiàn)。JVM 底層與GC(GarbageCollection) 的面試問題22)64 位JVM中,int 的長度是多數(shù)?Java中,int類型變量的長度是一個固定值,與平臺無關(guān),都是32位。意思就是說,在32位和64位的Java虛擬機(jī)中,int類型的長度是相同的。23)Serial 與ParallelGC 之間的不同之處?Serialstop-the-world
與
Parallel 在GC執(zhí)行的時候都會引起。它們之間主要不同 serial 收集器是默認(rèn)的復(fù)制收集器,執(zhí)行GC的時候只有一個線程,而
parallel
收集器使用多個GC線程來執(zhí)行。24)32 位和64位的JVM,int 類型變量的長度是多數(shù)?32位和64位的JVM中,int類型變量的長度是相同的,都是32位或者4個字節(jié)。25)Java中WeakReference與SoftReference的區(qū)別?雖然WeakReference與SoftReference 都有利于提高GC和內(nèi)存的效率,但是 WeakReference,一旦失去最后一個強(qiáng)引用,就會被GC回收,而軟引用雖然不能阻止被回收, 但是可以延遲到 JVM內(nèi)存不足的時候。26)WeakHashMap 是怎么工作的?WeakHashMap的工作與正常的HashMap類似,但是使用弱引用作為key,意思就是當(dāng)key對象沒有任何引用時,key/value將會被回收。27)JVM 選項-XX:+UseCompressedOops有什么作用?為什么要使用?當(dāng)你將你的應(yīng)用從 32位的JVM遷移到64位的JVM時,由于對象的指針從 32位增加到了64位,因此堆內(nèi)存會突然增加,差不多要翻倍。這也會對 CPU緩存(容量比內(nèi)存小很多)的數(shù)據(jù)產(chǎn)生不利___。因?yàn)?,遷移到64位的JVM主要動機(jī)在于可以指定最大堆大小,通過壓縮OOP可以節(jié)省一定的內(nèi)存。通過-XX:+UseCompressedOops選項,JVM會使用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í)際上會比這個小很多。不同操作系統(tǒng)之間不同,如 Windows系統(tǒng)大約1.5GB,Solaris 大約3GB。64位JVM允許指定最大的堆內(nèi)存,理論上可以達(dá)到 2^64,這是一個非常大的數(shù)字,實(shí)際上你可以指定堆內(nèi)存大小到100GB。甚至有的JVM,如Azul,堆內(nèi)存到1000G都是可能的。30)JRE 、JDK、JVM及JIT 之間有什么不同?JRE 代表Java 運(yùn)行時(Javarun-time) ,是運(yùn)行Java 引用所必須的。JDK代表Java 開發(fā)工具(Javadevelopmentkit) ,是Java程序的開發(fā)工具,如Java 編譯器,它也包含JRE。JVM代表Java 虛擬機(jī)(Javavirtualmachine) ,它的責(zé)任是運(yùn)行 Java 應(yīng)用。JIT 代表即時編譯(JustInTimepilation) ,當(dāng)代碼執(zhí)行的次數(shù)超過一定的閾值時,會將Java 字節(jié)碼轉(zhuǎn)換為本地代碼,如,主要的熱點(diǎn)代碼會被準(zhǔn)換為本地代碼,這樣有利大幅度提高 Java 應(yīng)用的性能。解釋Java堆空間及GC?當(dāng)通過Java命令啟動Java進(jìn)程的時候,會為它分配內(nèi)存。內(nèi)存的一部分用于創(chuàng)建堆空間,當(dāng)程序中創(chuàng)建對象的時候,就從對空間中分配內(nèi)存。GC是JVM內(nèi)部的一個進(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ū)域,使用目的也不同。棧常用于保存方法幀和局部變量,而對象總是在堆上分配。棧通常都比堆小,也不會在多個線程之間共享,而堆被整個JVM的所有線程共享。Java 基本概念面試題35) “a==b”和”a.equals(b) ”有什么區(qū)別?如果
a
和
b
都是對象,則
a==b
是比較兩個對象的引用,只有當(dāng)
a
和
b
指向的是堆中的同一個對象才會返回
true
,而a.equals(b)
是進(jìn)行邏輯比較,所以通常需要重寫該方法來提供邏輯一致性的比較。例如, String 類重寫equals() 方法,所以可以用于兩個不同對象,但是包含的字母相同的比較。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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 煤制合成氣生產(chǎn)中工藝安全風(fēng)險識別與評估考核試卷
- 液壓元件試驗(yàn)方法與標(biāo)準(zhǔn)考核試卷
- 林業(yè)碳匯與碳排放權(quán)交易考核試卷
- 人工智能在法律領(lǐng)域的應(yīng)用考核試卷
- 公寓別墅商鋪銷售合同范例
- 全國授權(quán)合同標(biāo)準(zhǔn)文本
- 清潔電器產(chǎn)品的市場定位與競爭策略考核試卷
- 焙烤食品制造行業(yè)發(fā)展模式創(chuàng)新考核試卷
- 加盟合作經(jīng)營合同范例
- 借貸債權(quán)轉(zhuǎn)讓合同范例
- 2022年全國交通運(yùn)輸行業(yè)城市軌道交通列車司機(jī)職業(yè)技能大賽參考題庫
- 3d3s門式鋼架 入門教程
- 儲能技術(shù)-氫儲能
- 《看看我們的地球》閱讀測試題及答案
- 2023年中央宣傳部直屬單位招考聘用88人模擬預(yù)測試卷【共500題含答案解析】
- 鍋爐爐管“四管泄漏”的原因
- 胃結(jié)石護(hù)理查房課件
- GB/T 18337.1-2001生態(tài)公益林建設(shè)導(dǎo)則
- 院感手衛(wèi)生培訓(xùn)課件
- (山東科技大學(xué))PTA數(shù)據(jù)結(jié)構(gòu)答案與解析-363
- 失眠認(rèn)知行為治療課件
評論
0/150
提交評論