面試題收集

Synchronized關鍵字和ReentrantLock的對比
相同點:互斥性、內存可見性、可重入

不同點:

①ReentrantLock相比synchronized提供了更多的特性:支持輪詢鎖(tryLock)、定時鎖(帶定時的tryLock)、可中斷鎖(lockInterruptibly)、公平鎖;

②synchronized釋放鎖和操作總是和獲取鎖的操作處于同一代碼塊,而ReentrantLock支持非塊結構的加鎖

③每個內置鎖只有一個條件,而ReentrantLock可以通過newCondition支持多個Condition。

用過哪些線程池,ThreadPoolExecutor的參數含義
線程池根據創建方法的不同主要分:

FixedThreadPool,SingleThreadExecutor,CachedThreadPool,ScheduledThreadPool,SingleThreadScheduledExecutor;

ThreadPoolExecutor的各個參數含義如下:

int maximumPoolSize //最大線程數

long keepAliveTime //超過corePoolSize的空閑線程多久會被銷毀

TimeUnit unit //keepAliveTime的單位

BlockingQueue<Runnable> workQueue //被提交但尚未被執行的任務

ThreadFactory threadFactory //線程工廠,一般用DefaultThreadFactory

RejectedExecutionHandler handler) //線程池關閉或任務太多來不及處理時的拒絕策略

Object類中包含哪些方法
不要小看這個問題,Object類作為Java中最根本的類,它包含的方法一定要深入理解才行,其中的任何一個方法都可以作為面試題。當你回答每個方法時,最好也簡單說明下這個方法的作用。

Object類中的方法(共11個,前2個是protected其他是public,native方法未計入在內)

Object clone(): 創建并返回此對象的一個副本(淺拷貝,如果對象中包含數組則拷貝后會共用同一個數組)

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(): 喚醒在此對象監視器上等待的單個線程

void notifyAll(): 喚醒在此對象監視器上等待的所有線程

Class<?> getClass(): 返回此Object的運行時類

Java中強引用和弱引用的區別
在JDK 1.2后,將對象引用分為4種級別,引用強度依次減弱:強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(Phantom Reference)。

雖然這邊面試官只問了其中的兩種,但是如果你能把四種都說清楚,那顯然是個加分項。

強引用(Strong Reference):平時聲明變量使用的就是強引用,只要強引用還存在,垃圾收集器即使OOM也不會回收掉被引用的對象。

軟引用(Soft Reference):描述有用但非必須的對象,在將要發生OOM之前會進行回收,如果回收還是沒有足夠內存才會拋OOM。

弱引用(Weak Reference):描述非必須的對象,當垃圾收集器工作時,無論當前內存是否足夠,都會回收掉只被弱引用關聯的對象。

虛引用(Phantom Reference):最弱的一種引用關系,一個對象是否有虛引用的存在,完全不會對其生存時間構成影響,也無法通過虛引用來取得一個對象實例。

如何解決哈希沖突
1.鏈地址法:把所有的沖突關鍵字存儲在一個線性鏈表中.

2.開放定址法

線性探測法:沖突發生時順序查看下一個單元,直到找出一個空單元或查遍全表.

另有二次探測法、偽隨機探測法

3.再散列法:當發生沖突時,利用另一個哈希函數再次計算一個地址,直到沖突不再發生

4.建立一個公共緩沖區.一旦由哈希函數得到的地址沖突,就都填入溢出表.

如果只是機械得回答上面的四種方法,讓人有種背答案的感覺,因此最好再舉一個Java中的HashMap的例子,可以這么補充:HashMap在JDK 1.7及以前版本采用鏈地址法解決哈希沖突,JDK 1.8開始進行了優化,默認情況下,當鏈表長度超過8時,會轉換成紅黑樹進行存儲(具體細節可以看源碼中put函數的邏輯)。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 相關概念 面向對象的三個特征 封裝,繼承,多態.這個應該是人人皆知.有時候也會加上抽象. 多態的好處 允許不同類對...
    東經315度閱讀 1,992評論 0 8
  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區別 13、...
    Miley_MOJIE閱讀 3,731評論 0 11
  • 讀過一首小詩:昨晚/因為城市停電/她來到陽臺上/看到了久違的月亮,短短幾句,整個城市的意境和情感就都有了。 詩歌和...
    蘭若9788閱讀 353評論 1 2
  • 泰戈爾原文: The perfect decks itself in beauty for thelove of ...
    語熙閱讀 1,228評論 0 5