????????我原本是一個醫(yī)學(xué)生决侈,但出于很多考慮,我決定轉(zhuǎn)行程序員朴则。相信應(yīng)該也有蠻多人和我一樣,在為自己喜歡的事業(yè)奮斗著卫病。突發(fā)奇想油啤,想記錄下每天一點自己在為Java面試所作的準(zhǔn)備典徘,記錄下自己覺得值得記錄的題目。這是一個系列益咬,我會一直堅持下去逮诲。
1. ?? 線程局部變量的理解
????????線程局部變量是局限于線程內(nèi)部的變量,屬于線程自身所有幽告。使用ThreadLocal來支持梅鹦。ThreadLocal是在線程里面維護(hù)了一個ThreadLocalMap將數(shù)據(jù)隔離,達(dá)到數(shù)據(jù)不共享的效果冗锁。
2.????Thread.sleep(0)的作用是什么齐唆?
? ? 由于java采用的是搶占式的線程調(diào)度算法,有可能出現(xiàn)某個線程常常獲得CPU控制權(quán)的情況冻河。為了讓那些線程優(yōu)先級比較低的線程也能獲得CPU的控制權(quán)箍邮,可以使用Thread.sleep(0)手動觸發(fā)一次操作系統(tǒng)分配時間片的操作茉帅。
3. ?? 簡述CAS操作
??????? 即Compare And Swap;有三個操作數(shù):內(nèi)存值V锭弊、舊的預(yù)期值A(chǔ)堪澎,要修改的值B。當(dāng)且僅當(dāng)A和V相同味滞,才會將內(nèi)存值修改為B并返回true樱蛤,否則只返回false。要和volatile變量結(jié)合使用剑鞍,保證變量是主內(nèi)存最新的那個值昨凡,否則不好成功。
4. ?? volatile變量修飾符的作用
? ? 1)修飾long或者double變量攒暇,使其能按原子類型來讀寫土匀。long和double變量是64位寬,因此對這類變量的讀寫第一次是32位形用,需要兩次就轧。這個過程不是原子的。而volatile修飾的話田度,可以使其按原子操作進(jìn)行妒御。
? ? 2)該修飾符還可以提供讀寫屏障。寫一個 volatile 變量之前镇饺,Java 內(nèi)存模型會插入一個寫屏障(write barrier)乎莉,讀一個 volatile 變量之前,會插入一個讀屏障奸笤。
5.????ArrayList和LinkedList的區(qū)別?
????????最明顯的區(qū)別是 ArrrayList底層的數(shù)據(jù)結(jié)構(gòu)是數(shù)組惋啃,支持隨機(jī)訪問,而 LinkedList 的底層數(shù)據(jù)結(jié)構(gòu)是雙向循環(huán)鏈表监右,不支持隨機(jī)訪問边灭。ArrayList優(yōu)勢在于查找快,但插入刪除慢健盒,LinkedList則相反绒瘦。
6.????HashMap的實現(xiàn)原理
? ? HashMap在往其中添加值的時候,要重新計算hash值扣癣,如果沒發(fā)生沖突惰帽,可直接加入。否則就要在沖突的地方形成一個鏈表父虑。新加入的在鏈頭该酗。在JDK1.8之后,當(dāng)沖突達(dá)到8個之后士嚎,使用紅黑樹呜魄。
7. Fail-fast和Fail-safe機(jī)制的區(qū)別
??????? java.util包中的所有集合類都被設(shè)計為fail->fast的烁焙,而java.util.concurrent中的集合類都為fail-safe的。當(dāng)檢測到正在遍歷的集合的結(jié)構(gòu)被改變時耕赘,F(xiàn)ail-fast迭代器拋出ConcurrentModificationException骄蝇,而fail-safe迭代器從不拋出ConcurrentModificationException。
8.????throw和throws的區(qū)別操骡?
????????throw用于主動拋出java.lang.Throwable 類的一個實例化對象九火,意思是說你可以通過關(guān)鍵字 throw 拋出一個 Error 或者 一個Exception,而throws 的作用是作為方法聲明和簽名的一部分册招,方法被拋出相應(yīng)的異常以便調(diào)用者能處理岔激。Java 中,任何未處理的受檢查異常強(qiáng)制在 throws 子句中聲明是掰。
9.????Java 中虑鼎,Serializable與 Externalizable 的區(qū)別
????????Serializable接口是一個可以用來標(biāo)記類序列化的標(biāo)記接口,沒有其他特殊的內(nèi)容键痛。但Externalizable 可以為類添加復(fù)雜的操作炫彩,更加具有實用性。
10.????簡述堆和棧的區(qū)別
????????VM 中堆和棧屬于不同的內(nèi)存區(qū)域絮短,使用目的也不同江兢。棧常用于保存方法幀和局部變量,而對象總是在堆上分配丁频。棧通常都比堆小杉允,也不會在多個線程之間共享,而堆被整個 JVM 的所有線程共享席里。