網易考拉海購Java後臺開發實習-面經(已拿offer)

寫於2017-10-18,博文從我的網站遷移到掘金。面試

一面(23min)

  • 自我介紹redis

  • 項目中最自豪的部分
    算法

    也沒什麼太自豪的,就是在移動端開發的時候不存在cookie和session,而後用redis存了一下驗證碼感受還不錯。編程

  • 講一講ArrayList和LinkedList
    ArrayList底層實現是數組,而且每次擴容擴容1.5倍,經常使用在查詢較多的場景中。而LinkedList底層實現是鏈表經常使用在增刪比較多的場景api

  • 你說你對鎖有了解,說一說你最熟悉的兩個鎖
    當時太緊張就隨口說了兩個,樂觀鎖,悲觀鎖。樂觀鎖:每次執行事務的時候都是先執行在檢查是否有其餘是否在執行。而悲觀鎖如行鎖,表鎖,都是先鎖定再執行事務。一般在併發量比較大的狀況下用悲觀鎖,併發量小的狀況下用樂觀鎖數組

  • 說一下synchronied和ReentrantLock的區別
    synchronied是JVM級別的,而ReentrantLock是api級別的,JVM會對synchronied作出相應的優化,鎖消除:當JVM斷定該資源不會被其餘線程爭奪的時候就會消除該鎖,還有鎖自旋,自適應鎖(面試官速度很快,還沒等我來得及解釋ReentrantLock就跳下一個問題了,也許是這個超底層的回答比較滿意吧)緩存

  • 講一下ThreadLoacal吧
    ThreadLocal底層實現是一個Map結構的表,key是Thread.currentThread(),而Value則是咱們想要保存的對象安全

  • 它(ThreadLocal)有什麼用,能夠舉一個例子嗎?
    能夠在每一個線程都擁有一個各自的副本,封裝起來不被影響,做用的話,能夠作一個相似賣票的系統,每一個售票廳(線程)只能出售100張票,不能多不能少服務器

  • 用過exchange()嗎
    很差意思,只敲過一次例子,不太瞭解cookie

  • 說一說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

總結

  1. 一面有點緊張,沒發揮好,不過能從底層回答的都從底層回答了,問的淺,答得較深
  2. 二面運氣不錯,剛好問到了擅長的部分,問的是要比一面更難,不過還算是答的比較好
  3. 最後感謝程濤學長提供的內推機會,以及一直以來在Java學習上的幫助!
相關文章
相關標籤/搜索