Synchronized關鍵字和ReentrantLock的對比
相同點:互斥性徒蟆、內存可見性添祸、可重入
不同點:
①ReentrantLock相比synchronized提供了更多的特性:支持輪詢鎖(tryLock)、定時鎖(帶定時的tryLock)、可中斷鎖(lockInterruptibly)媚送、公平鎖;
②synchronized釋放鎖和操作總是和獲取鎖的操作處于同一代碼塊寇甸,而ReentrantLock支持非塊結構的加鎖
③每個內置鎖只有一個條件塘偎,而ReentrantLock可以通過newCondition支持多個Condition。
用過哪些線程池拿霉,ThreadPoolExecutor的參數(shù)含義
線程池根據(jù)創(chuàng)建方法的不同主要分:
FixedThreadPool,SingleThreadExecutor,CachedThreadPool,ScheduledThreadPool,SingleThreadScheduledExecutor吟秩;
ThreadPoolExecutor的各個參數(shù)含義如下:
int maximumPoolSize //最大線程數(shù)
long keepAliveTime //超過corePoolSize的空閑線程多久會被銷毀
TimeUnit unit //keepAliveTime的單位
BlockingQueue<Runnable> workQueue //被提交但尚未被執(zhí)行的任務
ThreadFactory threadFactory //線程工廠,一般用DefaultThreadFactory
RejectedExecutionHandler handler) //線程池關閉或任務太多來不及處理時的拒絕策略
Object類中包含哪些方法
不要小看這個問題,Object類作為Java中最根本的類绽淘,它包含的方法一定要深入理解才行涵防,其中的任何一個方法都可以作為面試題。當你回答每個方法時沪铭,最好也簡單說明下這個方法的作用壮池。
Object類中的方法(共11個,前2個是protected其他是public,native方法未計入在內)
Object clone(): 創(chuàng)建并返回此對象的一個副本(淺拷貝,如果對象中包含數(shù)組則拷貝后會共用同一個數(shù)組)
void finalize(): 當垃圾回收器確定不存在對該對象的更多引用時,由對象垃圾回收器調用此方法
String toString(): 返回該對象的字符串表示
int hashCode(): 返回該對象的哈希碼值,native方法.
boolean equals(Object obj): 指示其他某個對象是否與此對象“相等”,默認通過==(對象地址值)來比較.
void wait(): 在其他線程調用此對象notify()或notifyAll() 方法前,導致當前線程等待
void wait(long timeout):在其他線程調用此對象notify()或notifyAll()方法或者超過指定時間前,導致當前線程等待
void wait(long timeout, int nanos): 在其他線程調用此對象notify()或notifyAll() 方法,或者其他某個線程中斷當前線程,或者已超過某個實際時間前,導致當前線程等待
void notify(): 喚醒在此對象監(jiān)視器上等待的單個線程
void notifyAll(): 喚醒在此對象監(jiān)視器上等待的所有線程
Class<?> getClass(): 返回此Object的運行時類
Java中強引用和弱引用的區(qū)別
在JDK 1.2后,將對象引用分為4種級別伦意,引用強度依次減弱:強引用(Strong Reference)火窒、軟引用(Soft Reference)、弱引用(Weak Reference)驮肉、虛引用(Phantom Reference)熏矿。
雖然這邊面試官只問了其中的兩種,但是如果你能把四種都說清楚离钝,那顯然是個加分項票编。
強引用(Strong Reference):平時聲明變量使用的就是強引用,只要強引用還存在卵渴,垃圾收集器即使OOM也不會回收掉被引用的對象慧域。
軟引用(Soft Reference):描述有用但非必須的對象,在將要發(fā)生OOM之前會進行回收浪读,如果回收還是沒有足夠內存才會拋OOM昔榴。
弱引用(Weak Reference):描述非必須的對象辛藻,當垃圾收集器工作時,無論當前內存是否足夠互订,都會回收掉只被弱引用關聯(lián)的對象吱肌。
虛引用(Phantom Reference):最弱的一種引用關系,一個對象是否有虛引用的存在仰禽,完全不會對其生存時間構成影響氮墨,也無法通過虛引用來取得一個對象實例。
如何解決哈希沖突
1.鏈地址法:把所有的沖突關鍵字存儲在一個線性鏈表中.
2.開放定址法
線性探測法:沖突發(fā)生時順序查看下一個單元,直到找出一個空單元或查遍全表.
另有二次探測法吐葵、偽隨機探測法
3.再散列法:當發(fā)生沖突時,利用另一個哈希函數(shù)再次計算一個地址,直到沖突不再發(fā)生
4.建立一個公共緩沖區(qū).一旦由哈希函數(shù)得到的地址沖突,就都填入溢出表.
如果只是機械得回答上面的四種方法规揪,讓人有種背答案的感覺,因此最好再舉一個Java中的HashMap的例子温峭,可以這么補充:HashMap在JDK 1.7及以前版本采用鏈地址法解決哈希沖突猛铅,JDK 1.8開始進行了優(yōu)化,默認情況下诚镰,當鏈表長度超過8時奕坟,會轉換成紅黑樹進行存儲(具體細節(jié)可以看源碼中put函數(shù)的邏輯)。