天天看點

3.19美團實習面試一面二面(已offer)

Integer常量池和String常量池是不同的。

如果你看去看 Integer.Java 類,你會發現有一個内部私有類,IntegerCache.java,它緩存了從-128到127之間的所有的整數對象。

Integer i = value;(自動裝箱)如果i是在-128到127之間,不會去堆中建立對象,而是直接傳回IntegerCache中的值;如果值不在上面範圍内則會從堆中建立對象。= 走的是valueOf()方法,valueOf(int)會走緩存。

Integer i2 = new Integer(xxxx);不管參數的value是多少都會從堆中建立對象,與IntegerCache沒關系。

  一道經典的面試題:new String(“abc”)建立幾個對象?

簡單的回答是一個或者兩個,如果是常量區有值為"abc"的值,則隻在堆中建立一個對象;如果常量區沒有則會在常量區建立"abc"。

總結:隻要出現了new 就一定在堆裡面創造了對象,Integer如果是自動裝箱那麼-128到127是在緩存裡的直接取,範圍外的不在緩存使用new。

String 如果用雙引号在常量池建立對象,如果new String(“abc”)都建立。

1.自我介紹0-8

2.堆和棧

3.垃圾回收 什麼for gc(應該是full gc)

4.Integer這裡問的IntegerCache,搞錯成方法區的常量池了。。

5.concurrenthashmap1.7和1.8的差別 隻答了兩個,資料結構和鎖的位置。

應該還有hash次數的差別,1.7用的繼承reentrantlock鎖,1.8用的cas,synchronized。

<JDK1.7>,

分段鎖 對整個桶數組進行了分割分段(Segment),每一把鎖隻鎖容器其中一部分資料,多線程通路容器裡不同資料段的資料,就不會存在鎖競争,提高并發通路率。

<jdk1.8>

使用的是優化的synchronized 關鍵字同步代碼塊 和 cas操作了維護并發。

《1.7》ConcurrentHashMap 使用的分段鎖,如果一個線程占用一段,别的線程可以操作别的部分,

《1.8》簡化結構,put和get不用二次哈希,一把鎖隻鎖住一個連結清單或者一棵樹,并發效率更加提升。

6.線程池 隻知道目的,沒有用過。核心線程池大小,最大線程池尺寸,工作隊列尺寸,“臨時”線程超過一段時間會自動結束,線程工廠,飽和政策。一批任務先是會導緻建立線程到核心線程池大小,然後放工作隊列,然後建立線程到最大線程池尺寸。

7.寫dcl單例 不能用idea 後面卡住了還是因為沒有動手編然後沒去嘗試,就崩了(19-29用了10分鐘)

8.輸出全排列 不能用idea 後面調試讓用了,不用idea編的很卡頓,dfs編出來了(30-50)因為開始沒讓用idea 卡了很久 編的很慢。

反問環節

:喜歡招什麼學的好的學生?什麼什麼能力來着,不是算法能力,用不到作業系統,資料庫緩存啥的是加分項,不是複現論文,不知道還有什麼能力了。說我算法還要加強(可能崩了,說很多面試都不讓用idea)。

校招和實習123面要求都差不多,社招123面差很多。

二面

開始問項目,介紹項目,項目亮點(答 太久了忘了細節,算法都是大都是論文裡面的)

因為我說用了java面向對象特性,開始問設計模式的原則,知道哪些設計模式,适用場景,等

背記憶體模型,gc,不讓我背了,問g1回收器,對象建立到回收的曆程。(問的都不會)

然後問 分布式 資料庫 spring架構web項目 。。。都不會

場景題:密室預約時間(做活動時時間段會改變,要考慮更多),看是否有人已經預定。(然後如果時間粒度變成10分鐘會更靈活改變時間段預約)

深度帶随機指針的克隆連結清單;有沒有空間複雜度低的算法(連結清單中穿插複制的連結清單節點代替了map的功能)。

java單繼承簡單,多繼承會麻煩,會有鑽石問題,不知道該用哪個父類的方法。

對象的組合是在運作時刻通過對象之間擷取引用關系定義的,是以對象組合要求不同的對象遵從對方所實作的接口來實作引用傳遞, 這樣反過來會要求更加用心設計的接口,以此支援你在使用一個對象時, 可以把它和很多其他的對象組合在一起使用而不會出現問題。對象的組合由于是通過接口實作的, 這樣在複用的過程中是不會打破其封裝的。 任意一個對象都可以在運作時刻被替換成另外一個實作了相同接口且類型相同對象, 更重要的是,由于一個對象的實作是針對接口而編寫的, 具體實作之間的依賴會更少。對象組合的方式可以幫助你保持每個類的内聚性,讓每個類專注實作一個任務。 類的層次會保持的很小,不會增長到一種無法管理的恐怖數量。 (這也是為什麼Java語言支援單繼承的原因)