2021屆Java開發求職-------面試實戰之美團數據平臺

一.前言

雖然從大三開始就實習好久了,但是現在可能也面臨找工作(假如現在沒法轉正的話),所以找點面經鞏固一下知識,嘿嘿,算法也要看,每天一道leetcode先吧


二.具體內容

這是一份美團的 鏈接:https://www.nowcoder.com/discuss/352030

一面
JVM:

JVM的結構:

這個要分公有,私有:(針對線程而言

  • 公有部分:堆區,方法區
  • 私有部分:程序計數器,虛擬機棧,本地方法棧
  • 詳細的文章:JVM內存結構

新生代和老年代的垃圾回收算法:

這個首先得明確新生代和老年代是什麼,也就是JVM堆結構這塊,

在這裏插入圖片描述

這是Java堆的內存結構,可以看出來,整個堆區分爲兩個大塊----年輕代和老年代。年輕代內又分爲Eden區,From Survivor 0 區和To Survivor 1區,其默認比例爲8比1。爲什麼要這麼劃分呢? 年輕代中的對象基本都是朝生夕死的(80%以上),也正因如此,在年輕代的垃圾回收算法使用的是複製算法,複製算法的基本思想就是將內存分爲兩塊,每次只用其中一塊,當這一塊內存用完,就將還活着的對象複製到另外一塊上面。複製算法不會產生內存碎片。

總結:對於存活對象少的新生代區域,比較適合採用複製算法。這樣只需要複製少量對象,便可完成垃圾回收,並且還不會有內存碎片。而對於老年代這種存活對象多的區域,比較適合採用標記壓縮算法或標記清除算法,這樣不需要移動太多的內存對象。

虛擬機棧和本地方法棧的區別:

虛擬機棧:這個棧與線程同時創建,用來存儲棧幀,即存儲局部變量與一些過程結果的地方。棧幀存儲的數據包括:局部變量表、操作數棧。

本地方法棧:本地方法棧與虛擬機棧基本類似,區別在於虛擬機棧爲虛擬機執行的java方法服務,而本地方法棧則是爲Native方法服務。

類信息會加載到JVM哪個區域

方法區

HashMap 和 ConcurrentHashMap 的區別

一般而言concurrentHashMap是線程安全的,具體實現:在1.7採取的segment分段鎖,有點類似於16個線程安全的hashtable組合成了一個concurrenthashmap,不同分段操作不需要上鎖,同一個分段才需要上鎖,讀不上鎖,寫上鎖。鎖的粒度更加精細。而1.8採取的AQS和CAS來實現。

final 的作用,加在變量、方法、類的區別
  1. 修飾變量,爲常量,值不可變
  2. 修飾對象,值可變,引用不變
  3. 修飾方法,方法不可重寫
  4. 修飾類,無子類,不可以被繼承
新建一個 string 會創建幾個對象

(1)字面量賦值方式 eg:String str = “Hello”;

該種直接賦值的方法,JVM會去字符串常量池(String對象不可變)中尋找是否有equals(“Hello”)的String對象,如果有,就把該對象在字符串常量池中"Hello"的引用複製給字符串變量str,如若沒有,就在堆中新建一個對象,同時把引用駐留在字符串常量池中,再把引用賦給字符串變量str。

用該方法創建字符串時,無論創建多少次,只要字符串的值(內容)相同,那麼它們所指向的都是堆中的同一個對象。

該方法直接賦值給變量的字符串存放在常量池裏

(2)new關鍵字創建新對象 eg:String str = new String(“Hello”);

利用new來創建字符串時,無論字符串常量池中是否有與當前值相同的對象引用,都會在堆中新開闢一塊內存,創建一個新的對象。如果算上棧的引用str,如果字符串常量池有"Hello",那麼兩個,否則三個。

哪些類是線程安全的

這題感覺比較泛,隨便答一下

線程池的參數;爲什麼需要超出最大容量的策略

本人的博文:線程池七大參數

ThreadLocal瞭解嗎

線程局部變量是侷限於線程內的變量,屬於線程自身所有,不在多個線程間共享。java提供ThreadLocal類來支持線程局部變量,是一個實現線程安全的方式。


Spring

AOP的實現原理 :動態代理

CGLIB動態代理與JDK動態區別

java動態代理是利用反射機制生成一個實現代理接口的匿名類,在調用具體方法前調用InvokeHandler來處理。

而cglib動態代理是利用asm開源包,對代理對象類的class文件加載進來,通過修改其字節碼生成子類來處理。

Spring中:

1、如果目標對象實現了接口,默認情況下會採用JDK的動態代理實現AOP

2、如果目標對象實現了接口,可以強制使用CGLIB實現AOP

3、如果目標對象沒有實現了接口,必須採用CGLIB庫,spring會自動在JDK動態代理和CGLIB之間轉換

JDK動態代理只能對實現了接口的類生成代理,而不能針對類 。 CGLIB是針對類實現代理,主要是對指定的類生成一個子類,覆蓋其中的方法 。 因爲是繼承,所以該類或方法最好不要聲明成final ,final可以阻止繼承和多態。

@Autowired和@Resource的區別

@Autowired註解是按類型裝配依賴對象,默認情況下它要求依賴對象必須存在,如果允許null值,可以設置它required屬性爲false。@Resource註解和@Autowired一樣,也可以標註在字段或屬性的setter方法上,但它默認按名稱裝配。名稱可以通過@Resource的name屬性指定,如果沒有指定name屬性,當註解標註在字段上,即默認取字段的名稱作爲bean名稱尋找依賴對象,當註解標註在屬性的setter方法上,即默認取屬性名作爲bean名稱尋找依賴對象。

什麼情況下會用@Resource

當需要在某個類中定義一個屬性,並且該屬性是一個已存在的bean,要爲該屬性賦值或注入時在該屬性上一行使用@Resource(name=“xxx”),相當於爲該屬性注入一個名稱爲xxx的bean。

MySQL

B+樹的優勢
悲觀鎖和樂觀鎖瞭解嗎
數據庫如何實現樂觀鎖
工廠模式怎麼理解
單例模式有哪幾種實現方式

算法

反轉鏈表:一道比較常規的題目,可以用遞歸來做也可以迭代:

二面

JAVA基礎

HashMap 和 ConcurrentHashMap 的區別:
hash 衝撞怎麼辦?如何 rehash
HashMap 的遍歷方式
爲什麼 HashMap 是線程不安全的
volatile 和 synchronized 的區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章