
1.回答輸出結果為什么Integer i new Integer(100); Integer j new Integer(100); System.out.println(i j); String a abc; String b a b c; System.out.println(a b); String c abcd; String d a d; System.out.println(c d);1.ij 輸出false原因i和j對象雖然在常量池范圍內但都通過new關鍵字分配新內存地址。2.ab輸出true原因都是字符串常量都直接在字符串常量池中直接引用。3.cd輸出false原因d是在堆內創(chuàng)建新字符串對象。2.String b在JVM中具體是怎么創(chuàng)建的在棧中創(chuàng)建一個b變量在字符串常量池招是否存在“abc“若找到了則直接引用沒有找到在字符串常量池中創(chuàng)建。3.JVM中運行時數(shù)據區(qū)都包含那些部分分為線程私有和線程共享線程私有程序計數(shù)器本地方法棧虛擬機棧。線程共享元空間堆4.堆是干嘛的方法區(qū)是干嘛的虛擬機棧是干嘛的堆是用來存創(chuàng)建的對象數(shù)組等方法區(qū)存儲字節(jié)碼指令類的結構信息靜態(tài)變量常量JIT編譯器編譯的目標對象識別的機器碼。虛擬機棧存入一個個棧幀一層層方法每個棧幀保存了每個方法的局部變量操作數(shù)棧和動態(tài)鏈接方法出口等信息。5.講講堆分為那些部分每個部分都是啥堆分為新生代和老年代新生代約占1/3分為survive0和survive1和Eden區(qū)老年代約占2/3.6.講講垃圾收集新生代中對于Eden區(qū)域中的對象生命周期短所以垃圾收集頻率高速率塊未回收的進入到survive0中而在老年代中對象占用空間大生命周期長回收頻率低速率慢。7.一個對象是怎么從新生代流轉到老年代的新生代對象經過頻繁的垃圾收集還存活達到閾值時會流轉到老年代當新生代容量不夠時survive0,survive1中的對象會直接流轉為老年代對象。8.surviveo區(qū)域、survive1區(qū)域具體講講新生代中經歷垃圾回收存活的對象的年齡加1并放入到surivie0中如果達到閾值則流轉為老年代對象。survive1和survive0中總有一個為空。9.Java線程有那些狀態(tài)各個狀態(tài)是怎么流轉的當線程新創(chuàng)建時未執(zhí)行start()方法時處于New狀態(tài)當線程準備執(zhí)行或正在執(zhí)行時處于RANNABLE狀態(tài)執(zhí)行join時間值wait時間值等方法時間處于計時等待狀態(tài)等待時間結束處于RANABLE狀態(tài)執(zhí)行joinwait方法時處于等待狀態(tài)需要通過notifynotifyall等方法喚醒如果存在鎖競爭鎖失敗的線程處于阻塞狀態(tài)執(zhí)行ran()方法完畢進入終止狀態(tài)。10.如果執(zhí)行sleep方法會進入什么狀態(tài)線程會進入計時等待狀態(tài)休眠狀態(tài)如果有鎖并不會釋放鎖一直持有鎖。11.線程同步機制了解嗎了解過線程并發(fā)進行線程采用搶占模式為了使操作的資源正確通過同步鎖Synchronize保證線程的同步安全也可以使用CAS和ReentrantLock保證線程同步安全。12.Lock有哪些實現(xiàn)有ReentrantLockReentrantLockReadWriteLock等實現(xiàn)類都是保證線程同步安全的13.Synchronize和ReentrantLock有什么區(qū)別分別在什么情況下使用Synchronize是一個關鍵字聲明在方法上或在代碼塊中使用是隱式獲取鎖和釋放鎖用法簡單不能中斷不能判斷狀態(tài)不能設置超時僅支持非公平鎖底層是通過Monitor監(jiān)視器、而ReentrantLock是Lock類的實現(xiàn)類需要通過創(chuàng)建對象通過對象調用獲取鎖和釋放鎖的方法也可以trylock()非阻塞的方式顯式獲取和釋放鎖unlock()必須配合findlly 代碼塊使用用法復雜可以通過lockInterruptibly()中斷通過trylock時間值設置超時時間支持公平鎖和非公平鎖底層是通過AQS實現(xiàn)的。14.講講Synchronize鎖升級鎖升級是從無鎖-偏向鎖-輕量級鎖-重量級鎖偏向鎖是只有一個線程頻繁的獲取釋放鎖會記住這個線程不用通過鎖直接比較實現(xiàn)如果過發(fā)現(xiàn)不同的線程會升級為輕量級鎖線程競爭不激烈沖突小線程通過CAS的方式獲取鎖如果CAS長時間自旋說明沖突激烈鎖會升級為重量級鎖具有強烈的互斥性和排他性已獨占的方式獲取鎖。15.講講CAS的原理會遇到什么問題怎么解決CAS是一種無鎖化的并發(fā)管理操作執(zhí)行流程是先獲取內存中需要修改的值A通過計算得出B再將自己拿到的值A與內存中的值C比較如果相同則進行更新操作如果不同則進行重試或自旋操作。會出現(xiàn)ABA問題是CAS拿到內存中的值A10但是存在另一個線程修改內存中的值為10當前線程比較時內存中的值與自己的值相同邊進行更新沒有發(fā)現(xiàn)其他修改的線程可以通過加一個版本號解決。16.線程安全的集合類有哪些1.CopyOnWriteArrayList,使用ReentrantLock保證線程安全。2.CopyOnWriteArraySet內部是一個CopyOnWriteArrayList,所以使用ReentrantLock保證線程安全。3.ArrayBlockingQueue使用一個鎖ReentrantLock保證線程安全4.LinkedBlockingQueue使用兩個鎖對象ReentrantLock保證線程安全。5.ConcurrentHashMap使用CASsynchronize保證線程安全在沒有發(fā)生哈希沖突時使用CAS寫入發(fā)生發(fā)哈希沖突使用鏈表頭節(jié)點或紅黑樹的根節(jié)點作為鎖對象進行局部上鎖。6.Stack使用Synchronize保證線程安全。17.如果我想要一個線程安全的List應該怎么做可以使用CopyOnWriteArrayList適合讀多寫少的場景18.線程池了解嘛有哪些核心參數(shù)執(zhí)行流程是什么線程池是一種池化技術實現(xiàn)了線程復用線程的并發(fā)管理避免了線程的重復創(chuàng)建。參數(shù)核心線程數(shù)最大線程數(shù)非核心線程的空閑時間的時間單位阻塞工作隊列線程工廠拒絕策略。執(zhí)行流程當線程任務進入線程池判斷小于核心線程數(shù)則創(chuàng)建核心線程執(zhí)行該線程任務若大于核心線程數(shù)小于工作隊列則線程任務入隊等待若大于工作隊列小于最大線程數(shù)創(chuàng)建非核心線程執(zhí)行線程任務若大于最大線程數(shù)執(zhí)行拒絕策略。19.內存有限快速找到top10000怎么辦使用優(yōu)先隊列小頂堆棧先遍歷1000個數(shù)據通過for循環(huán)入隊剩余元素入隊元素隊頭元素對頭元素出隊遍歷至數(shù)據結束得到top1000020. 數(shù)據量極大找到一個數(shù)在其中是否存在怎么做使用布隆過濾器穿件創(chuàng)建布隆過濾器對象把數(shù)據存入到布隆過濾器中來判斷某個數(shù)字是否存在21.布隆過濾器的原理優(yōu)缺點將數(shù)據通過不同的哈希法計算出不同的哈希值并在位數(shù)組中將計算出來的哈希值位置上的0改為1.優(yōu)點可以高效率查詢和插入數(shù)據占用內存極小缺點存在誤判存入的數(shù)據不能取出原數(shù)據原生布隆過濾器不支持刪除。22. 如果讓你實現(xiàn)布隆過濾器的hash算法怎么寫使用不同的種子seed和容量cap和傳如數(shù)據datahash seed*cao-1data.hashcode^data.hashcode()16