天天看點

某大廠面試題(含答案)

Switch資料類型支援哪些

在JDK1.5之前,switch循環隻支援byte short char int四種資料類型.
JDK1.5 在switch循環中增加了枚舉類與byte short char int的包裝類------》對四個包裝類的支援是因為java編譯器在底層
手動進行拆箱,而對枚舉類的支援是因為枚舉類有一個ordinal方法,該方法實際上是一個int類型的數值.
JDK1.7在switch循環中增加了String類型-------》但實際上String類型有一個hashCode算法,結果也是int類型.
而byte short char類型可以在不損失精度的情況下向上轉型成int類型.是以總的來說,可以認為switch中隻支援int.
           

Java有哪些鎖?差別在哪?底層如何實作的?為什麼非公平鎖效率高?

公平鎖,非公平鎖,可重入鎖,共享鎖排他鎖,自旋鎖,讀寫鎖,悲觀鎖,樂觀鎖   無鎖 偏向鎖 輕量級鎖 重量級鎖
因為公平鎖來了線程需要挂起,然後還要判斷哪個線程被喚醒,
           

Java記憶體模型

主記憶體和工作記憶體,所有對象都放在主記憶體上,所有每個線程都有自己的工作記憶體,線程從主記憶體中将資料複制到自己的工作記憶體中
           

Java記憶體結構

堆負責存放對象 棧負責運作 方法區負責存放一些常量以及類資訊 程式計數器負責記錄程式運作的行數用于恢複運作 本地方法棧用于存放一些本地方法
           

線程池使用場景及其核心參數說明、拒絕政策

使用場景,io密集型,拒絕政策:1.直接抛出異常 2.不丢棄任務不抛異常,調用主線程來執行3.抛棄隊列中等待最久的任務4.直接丢棄    核心參數 corepoolsize  maximumpoolsize  keepalicetime unit workqueue threadFactory handler
           

Threadlocal原理和使用場景

原理,就是threadlocal維護了一個map 裡面key是一個弱引用,value是一個threadlocalmap,使用場景,每個線程都有自己的單獨的執行個體,執行個體需要在多個方法中共享,但不希望被多線程共享  資料庫連接配接,Session管理
           

實作多線程通訊

wait notify notifyall lock 停止線程 守護線程 join yield 優先級
           

Mybatis初始化和執行原理

讀取XML,或者讀取注解,建構Configuration對象,生成SqlSessionFactory執行個體,執行流程大概是,去mapper裡面根據方法id拿到sql,設定參數,連接配接池拿到連接配接,執行,傳回結果
           

Spring mvc初始化和執行原理

1.使用者發送請求至前端控制器DispatcherServlet。
           

2.DispatcherServlet收到請求調用HandlerMapping處理器映射器。

     3.處理器映射器找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一并傳回給DispatcherServlet。

     4.DispatcherServlet調用HandlerAdapter處理器擴充卡。

     5.HandlerAdapter經過适配調用具體的處理器(controller,也叫後端控制器)。

     6.Controller執行完成傳回ModelAndView。

     7.HandlerAdapter将Controller傳回的執行結果ModelAndView傳回給DispatcherServlet。

     8.DispatcherServlet将ModelAndView傳給ViewReslover視圖解析器。

     9.ViewReslover解析之後傳回具體的view。

     10.DispatcherServlet根據View進行渲染視圖(即将模型資料填充至視圖jsp/freemaker…中)。

     11.DispatcherServlet響應使用者。

Springboot如何自定義starter

建立一個spring.factories檔案,在裡面配上自動配置類的路徑,編寫自動配置類,加上@Configuration
           

項目中使用了springcloud哪些元件及其原理

nacos zipkin (Eureka,config) gateway,sentinel,openfeign。。。。
           

Redis資料類型

string list hash set zset
           

Redis淘汰政策

優先删除最老的資料 随機删除資料 抛異常 删除有逾時時間的随機資料 删除逾時時間最短的資料 删除最老的資料限于有存活時間
           

Redis叢集方式

哨兵 主從複制 redis-cluster叢集  https://www.cnblogs.com/runnerjack/p/10269277.html
           

Redis中string底層結構

int embstr raw 其中embstr和raw一個是44長度一下,一個是長度的,裡面使用的事sdshdr存儲,其中sdshdr5式存儲長度不會變化且少于32個字元串,不可以擴容,,并且sds都取消了gcc的優化對齊,是以sds[-1]指向的事flags屬性的記憶體位址
底層是char[]類型存儲的,小于1M 每次配置設定*2 大于1M配置設定時多配置設定1M,二進制安全
           

MQ工作方式

work模式,一個生産者,多個消費者,每個消費者擷取的消息唯一
訂閱模式,一個生産者發送的消息會被多個消費者擷取,
路由模式,發送消息到交換機要指定路由key,消費者将隊列綁定到交換機時需要指定路由key
通配符模式,将路由鍵和某模式鏡像比對,此時隊列需要綁定在一個模式上,
rpc模式,
           

MySQL資料庫引擎比較

https://www.cnblogs.com/wangjian941118/p/10421716.html
           

事務隔離級别說明

讀未送出,不可重複讀,可重複讀,串行化 https://www.cnblogs.com/wyaokai/p/10921323.html
預設可從複讀  解決幻讀需要鎖表
           

批量導出的業務1000個,如何實作

io密集型,開多線程來導出,GZIPInputStream資料壓縮傳輸
           

什麼場景會出現棧溢出

在一個循環裡面出現建立大對象,局部數組過大,遞歸調用層次太多,
           

一般怎麼優化慢查詢

根據查詢字段建立索引,
           

什麼情況下會使得索引失效

聚集索引的時候不按照順序查詢,or的時候,就是查詢的時候一定要是在索引列是連續的一段 比如or,如果後面的沒有索引,那麼就不是連續的一段,比如 %w 存在這樣的情況在b+樹裡面不是連續的一段,而w%則是,
           

Redis分布式鎖中加鎖與解鎖的詳細細節詢問,過期如何續命

watchdog在過去三分之一時間之後 對鎖延長時間
           

Spring的ApplicationEvent的使用場景

異步發送消息,每個消息都有對應的處理,,每個子產品都會發送這個消息,,就可以使用 解耦使用
           

一個項目中可以有多個dispatcherServelt嗎?為什麼?

可以有,
           

SpringAOP涉及到什麼設計模式?底層原理

責任鍊,裝飾器模式,代理模式,原理是java代理模式和CGlib代理
           

SpringBoot配置檔案加載優先級

指令行指定參數,由jar包外向内加載,優先加載帶有profile,最後加載不帶profile的
           

SpringBoot啟動原理

從classpath中搜尋所有的META-INF/spring.factories配置檔案,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration對應的配置項通過反射(Java Refletion)執行個體化為對應的标注了@Configuration的JavaConfig形式的IoC容器配置類,然後彙總為一個并加載到IoC容器
           

Redis叢集有哪些方式

主從,哨兵,cluster
           

MySQL事務隔離級别

讀未送出,讀已送出,可重複讀,串行化
           

MySQL聚簇索引

就是幾個字段連起來成為一個索引
           

寫一個單例

DCL+構造檢查防止反序列化
           

ArrayList底層原理

底層是個數組,
           

ArrayList擴容、删除、添加原理

擴容 雙倍擴容     添加往數組最後添加,,,删除,
           

線程池核心參數說明(重要)

7大核心參數,corepoolsize 初始化線程數 maximumPoolSize 最線程數  keepAliveTime unit 超過初始化線程數之後的線程活躍時間  workQueue 等待隊列 threadFactory 建立線程的工廠 handler 拒絕政策
           

手寫一個定時的線程池

Executors.newSingleThreadScheduleExecutor().scheduleAtFixedRate(()->System.out.println(1),1,1,TimeUnit.SECONDS);
           

Mysql聚簇索引和非聚簇索引說明(重要)

聚集索引就是B+樹 葉子節點存放的是資料,其他節點存放的是索引的,,,非聚集索引葉子節點存放的是主鍵值,需要再次查詢,輔助索引
           

Java自帶的序列化方式

Serializable接口  Externalizable接口
           

項目使用了SpringCloud哪些元件

nacos,gateway sentinel zipkin feigin
           

Eureka屬于可用還是一緻?為什麼

高可用,因為如果節點挂了,eureka不會立即清除節點
           

Eureka實作服務治理的原理

自己注冊自己,實作高可用,自我保護機制,,服務注冊到Eureka上,會發送心跳,Eureka會剔除90s沒有心跳的服務,
           

Spring注解生效的原理(AOP底層原理)

動态代理	proxy還有CGLib
           

項目中如何使用政策模式

例如,一個資源的操作可能有增删改查操作,然後通過,某個code來找到各個操作對應的實作類,用具體實作類來調用
           

HashMap底層資料結構和原理

數組+連結清單,超過8個就變成紅黑樹
           

ConcurrentHashMap線程安全的原理

分段鎖,把Map分成多個分段,對資料操作對對應的分段加鎖,而不是整個表加鎖,1.8的時候變成node+cas+Synchronized,使用cas擷取到node,然後對node進行加鎖,
           

Sync和Lock的差別,底層原理

sync是關鍵字,lock是一個類 sync 可重入,不可中斷,非公平  lock 可重入,可中斷,可公平非公平
           

CAS中ABA如何解決

加上版本号
           

類加載機制中雙親委派

如果一個類加載器收到了類加載的請求,他首先不會自己去嘗試加載這個類,而是把這個請求委派父類加載器去完成。每一個層次的類加載器都是如此,是以所有的加載請求最終都應該傳送到頂層的啟動類加載器中,隻有當父加載器回報自己無法		完成這個請求(他的搜尋範圍中沒有找到所需的類)時,子加載器才會嘗試自己去加載。
           

ThreadLocal底層原理

底層是 以threadlocal為key,值為value 的一個entry。而key是一個弱引用,
           

Java線程池關鍵參數及其拒絕政策說明

AbortPolicy 丢棄任務抛異常   DiscardPolicy 丢棄任務 不抛異常  DiscardOldestPolicy丢棄隊列最前面的任務CallerRunsPolicy由調用線程執行該任務
           

Jvm記憶體結構詳細闡述

堆 棧 方法區 程式計數器 本地方法棧 執行引擎 本地接口
           

MySQL索引底層結構

b+樹
           

如何優化索引查詢

避免全表掃描,優先使用索引,最左字首原則,避免跳躍使用,不能使用or,索引組合不能有null,大量重複不能建立索引,不能使用函數,模糊查詢
           

組合索引的使用場景

多個字段更準确定位,如 姓和名能準确定位人,
           

MySQL隔離級别

讀未送出,讀已送出,可重讀,可串行化
           

髒讀、幻讀的定義

髒讀,讀到未送出的東西,,,幻讀,兩次讀取的内容不一樣
           

AOP底層原理

動态代理,CGlib
           

JDK動态代理和CGlib動态代理對比,各自底層的實作原理

jdk動态代理必須要實作一個接口,proxy隻能對某個接口進行代理,cglib是i操作位元組碼實作代理,用一個子類繼承之後對方法進行增強
           

FactoryBean和BeanFactory的差別

BeanFactory是個Factory,也就是IOC容器或對象工廠,FactoryBean是個Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)來進行管理的。但對FactoryBean而言,這個Bean不是簡單的Bean,而是一個能生産或者修		飾對象生成的工廠Bean
           

SpringMVC的攔截器和Filter的異同,自己配置過嗎?

攔截器是基于Java的反射機制的,而過濾器是基于函數回調。

攔截器不依賴于servlet容器,過濾器依賴于servlet容器。

攔截器隻能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。

攔截器可以通路action上下文、值棧裡的對象,而過濾器不能通路。

在action的生命周期中,攔截器可以多次被調用,而過濾器隻能在容器初始化時被調用一次。

攔截器可以擷取IOC容器中的各個bean(基于FactoryBean接口),而過濾器就不行,在攔截器裡注入一個service,可以調用業務邏輯。

Nginx的負載均衡方式有哪些?正向代理和反向代理的差別

輪詢,權重,ip_hash,fair按伺服器響應時間配置設定,url_hash按照url配置設定伺服器,正向代理 用戶端通過一個代理伺服器向請求的位址發送請求,反向代理是伺服器通過一個代理伺服器向外提供服務,正向代理服務端不知道真正請求者,反向代理		用戶端并不知道真正通路的服務端
           

RPC架構中服務消費者如何拿到服務提供者的請求資訊,各自職責

http協定是通過http調用拿到

BASE理論和CAP理論是指什麼

CAP:
	C:資料一緻性
	A:叢集可用性
	P:分區容錯性
	最多隻能實作這三點中的兩點,三者不可兼得。一般我們必須保證分區容錯性,C/A看情況采取。
BASE:
	BA:基本可用:在分布式系統中出現故障的時候,允許損失部分可用性,比如響應時間、功能上的可用性
	S:軟狀态:是指允許系統存在中間狀态,這些中間狀态不會影響系統的可用性
	E:最終一緻性:是指系統中所有的資料副本經過一定時間後,最終能夠到達一緻的狀态。
           

Mybatis中二級緩存和一級緩存的差別

一級緩存的作用域是一個sqlsession内;二級緩存作用域是針對mapper進行緩存
           

Netty中粘包和拆包是指什麼?

粘包就是包在發送的時候可能第一次和第二次發送的資料合在了一起,拆包就是合一起之後需要拆開
           

TCP中為什麼握手是三次而揮手是四次?

https://blog.csdn.net/jianjun_fei/article/details/102462920
           

用過什麼設計模式?描述一下場景

政策模式,單例,工廠,
           

SpringBean生命周期

執行個體化,填充屬性,setBeanName,setBeanFactory,setApplicationContext,postProcessBeforeInitilization,afterPropertiesSet,初始化,postProcessAfterInitialization,就緒,destory,
           

事務的原理

redolog undolog  undo log記錄被修改之前的記錄,用來復原,,redo log是用來恢複資料的 用于保障,已送出事務的持久化特性
           

Spring聲明式事務為什麼能每次拿到相同的connection

threadlocal
           

Springboot的starter元件的結構是什麼樣的

有一個配置類,在META-INF目錄下面有一個spring.factories檔案指定配置配置類中自動裝配的配置
           

HashMap1.7和1.8的差別在哪

1.8的結構是将數組+連結清單+紅黑樹,如果連結清單的長度超過8,那麼就轉換成紅黑樹
           

公平鎖和非公平鎖的差別

公平鎖,維護一個隊列,按照請求鎖的順序擷取鎖,非公平鎖,擷取鎖的線程是随機的
           

JVM記憶體結構的介紹

工作記憶體+主記憶體
           

垃圾回收算法有哪些?重點說說複制算法

标記清除,複制,标記整理,分代收集算法
           

常用的垃圾回事器有哪些?CMS的原理闡述一下

serial,parnew,parallelScavenge,CMS,g1,   初始标記(短暫stw),并發标記,預清理,重新标記(stw),并發清除,以擷取最短回收停頓時間為目标的回收器
           

Netty使用過嗎?講下原理

在NIO的基礎上封裝,boss線程負責擷取連接配接,work線程負責處理任務,通過pipline處理鍊來處理
           

粘包和拆包的解決方案有哪些?

在消息頭加上整個消息的長度,,,固定長度,,,
           

使用過哪些Redis的資料結構

string list hash set sortedsets.......	
           

消息幂等性如何解決

使用全局MessageID判斷消費方是否消費過,或者使用業務邏輯保證唯一,比如訂單号碼
           

消息順序消費如何解決,哪些MQ有這個特性

保證消息發送到同一個隊列中就可以,Rocketmq同一個隊列是順序消費的
           

Redis實作分布式鎖中,過期時間如何設定的(估計是在問NX和PX如何保持一緻性)

過期時間setnx,watchdog來延長過期時間
           

匿名内部類使用外部變量為什麼必須是final修飾的

因為生命周期的原因。方法中的局部變量,方法結束後這個變量就要釋放掉,final保證這個變量始終指向一個對象。首先,内部類和外部類其實是處于同一個級别,内部類不會因為定義在方法中就會随着方法的執行完畢而跟随者被銷毀。問題就來了,如果外部類的方法中的變量不定義final,那麼當外部類方法執行完畢的時候,這個局部變量肯定也就被GC了,然而内部類的某個方法還沒有執行完,這個時候他所引用的外部變量已經找不到了。如果定義為final,java會将這個變量複制一份作為成員變量内置于内部類中,這樣的話,由于final所修飾的值始終無法改變,是以這個變量所指向的記憶體區域就不會變
           

一條TCP連接配接上可以發多少個HTTP請求

如果開啟長連接配接,是可以對應多個http請求的

class加載過程

加載,驗證,準備,解析,初始化,使用,解除安裝,其中驗證是校驗class檔案是否合法,檔案頭,版本号子類的,準備是将方區中的一些靜态變量指派,解析,虛拟機常量池内的符号引用替換為直接引用的過程,初始化,執行類構造器<client>()方法的過程,類的一些屬性值的初始化,如果發現父類沒有初始化,先初始化父類,
           
某大廠面試題(含答案)