一面(23min)
也沒什麼太自豪的,就是在移動端開發的時候不存在cookie和session,而後用redis存了一下驗證碼感受還不錯。面試
- 講一講ArrayList和LinkedList
ArrayList底層實現是數組,而且每次擴容擴容1.5倍,經常使用在查詢較多的場景中。而LinkedList底層實現是鏈表經常使用在增刪比較多的場景
- 你說你對鎖有了解,說一說你最熟悉的兩個鎖
當時太緊張就隨口說了兩個,樂觀鎖,悲觀鎖。樂觀鎖:每次執行事務的時候都是先執行在檢查是否有其餘是否在執行。而悲觀鎖如行鎖,表鎖,都是先鎖定再執行事務。一般在併發量比較大的狀況下用悲觀鎖,併發量小的狀況下用樂觀鎖
- 說一下synchronied和ReentrantLock的區別
synchronied是JVM級別的,而ReentrantLock是api級別的,JVM會對synchronied作出相應的優化,鎖消除:當JVM斷定該資源不會被其餘線程爭奪的時候就會消除該鎖,還有鎖自旋,自適應鎖(面試官速度很快,還沒等我來得及解釋ReentrantLock就跳下一個問題了,也許是這個超底層的回答比較滿意吧)
- 講一下ThreadLoacal吧
ThreadLocal底層實現是一個Map結構的表,key是Thread.currentThread(),而Value則是咱們想要保存的對象
- 它(ThreadLocal)有什麼用,能夠舉一個例子嗎?
能夠在每一個線程都擁有一個各自的副本,封裝起來不被影響,做用的話,能夠作一個相似賣票的系統,每一個售票廳(線程)只能出售100張票,不能多不能少
- 用過exchange()嗎
很差意思,只敲過一次例子,不太瞭解
- 說一說JVM內存模型吧
我:棧區:每次方法的執行都會有一次棧幀的生成,而且其中有局部變量表。堆區:每次new出來的對象都保存在這兒。本地方法棧:經過C/C++調用系統接口的一些方法,方法區:類的信息 靜態變量都在這兒,還有程序計數器
- 說一說AOP吧
- AOP就是面向切面編程,並解釋了下列術語,joinpoint,pointcut,aspect,advice,並說了一下實現的原理,若實現了接口就是JDK動態代理不然就用CGLIB
- 瞭解asm嗎?
我反應了半天才想起這是一個jar包,不過從沒了解過就說不知道了
- String str1=new String("abc"),String str2=new String("abc"); str1==str2返回什麼
當時太緊張,注意力一直放在abc字符串上了忽略了這是new了一個對象,一直回答true,反問我好久我仍是沒反應過來,有點沒發揮好
- 知道如何讓線程同步嗎?
wait,notify,notifyAll,await,signal,siganlAll,countdownLatch,cyclicbarrer
- 說一說countdownlatch,cyclicbarrer
均可以等幾個線程就緒後再執行後續操做,區別就是cyclicbarrer是能夠複用的,而countdownlatch不能夠
- 舉個例子?
能夠假設如下場景,等9個跑步選手(線程)同時在起跑線就緒了再開始起跑
- 能夠實習多久
- 你的職業規劃
- 你有什麼想問個人嗎?
最後面試官簡單評價了一下:看得出來你平時看了不少書,不過前面有一兩個答錯了,你開始很緊張,後來好了一些。
二面(14min)
- 自我介紹
- 講一下hashmap吧
- hashmap底層是一個key-value結構的entry數組+鏈表,在put的時候根據key的hashcode的值在hash一次,而後根據獲得 的hash值再和hashmap的size取餘操做定位到要插入的哈希桶,若是爲null則插入,不然遍歷哈希桶後面的鏈表若是有key相等的則覆蓋,不然添加到尾部,而後檢查是否達到treshold須要擴容,而且每次擴容都是擴大兩倍
- hashmap能夠插入null值嗎
能夠
- 爲何呢?你不是說根據key的hashcode插入嗎
很差意思,我只是知道能夠,具體狀況不太清楚
- 你說你會MySQL調優SQL語句,那你通常是怎麼作的呢?
通常是先查看慢SQL日誌,而後explain一下該查詢語句,看是否索引失效或者是沒建索引
- 咱們都知道hashmap是線程不安全的,那麼爲何線程不安全呢?
由於當兩個線程同時對hasmap擴容的時候,會致使循環鏈表,使cpu達到100%,甚至宕機
- 你說你對多線程有所瞭解,那你說一下線程池的實現原理吧
<br好的,在線程池內部一共有這麼幾個參數,corepoolsize:核心線程數,maxpoolsize: 最大線程數,workquee:一個放預備線程的阻塞隊列,time:容許的空閒時間,handler:異常處理器。當向線程池加入一個線程的時候,若是運行的線程數小於corpoolsize,則直接執行此線程,若是等於了corepoolsize則提交給阻塞隊列阻塞等待,若是阻塞隊列已滿,則執行器繼續增長新的線程來執行任務,若是達到了maxpoolsize則執行handler的異常處理方法,有如下幾種方法拋出異常,忽略,提交線程者運行,刪除等待最久的線程**
- 說一說垃圾回收的時候,如何斷定一個對象是否須要回收?
一共有兩種算法,一種是引用計數算法,每被引用一次計數器就+1,當引用爲0就回收,不過這種算法有一個弊端就是,當對象之間互相引用的時候就永遠不會回收,因此用的最多的仍是GC ROOTS可達性分析,看對象是否被GC ROOTS引用,那麼哪些能夠做爲GC ROOTS呢?有如下四種:1.棧裏面的局部變量表,方法區的2.類靜態屬性引用的對象3.方法區中常量引用的對象,4.JNI本地變量棧中引用的對象
- 說一說你的項目中登陸是怎麼作的
大概就是redis作驗證碼緩存,MD5加密密碼(有點長。。省略)
- 說說cookie和session吧
session來自於cookie,session能夠放在cookie裏,而且cookie存在客戶端,session存在服務器端(簡單回答)
- 你說你用過redis,那你知道redis能夠作持久化嗎?
能夠
- 哪兩種?
RDB 和 AOF
總結
- 一面有點緊張,沒發揮好,不過能從底層回答的都從底層回答了,問的淺,答得較深
- 二面運氣不錯,剛好問到了擅長的部分,問的是要比一面更難,不過還算是答的比較好
- 最後感謝程濤學長提供的內推機會,以及一直以來在Java學習上的幫助!