網易考拉海購Java後臺開發實習-面經(已拿offer)
阿新 • • 發佈:2019-01-08
一面(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%,甚至宕機 - 你說你對多執行緒有所瞭解,那你說一下執行緒池的實現原理吧
好的,線上程池內部一共有這麼幾個引數,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學習上的幫助!