Java_面試札記

Java_面試札記 html

 

爲了避免死,我願獻出生命java

背景:記錄下寄幾和friend在2020年Java面試中遇到的problem。面試

一、MySQL索引結構?算法

基本上全部的索引都是B-Tree結構,還有一部分是HASH索引;B-Tree數據結構的簡單說明:spring

一、B-Tree結構首先是分紅不少節點,一個節點上面有不少的關鍵字(創建索引的字段),這些關鍵字在節點上是按照順序排列的;sql

二、在一個節點上,每個關鍵字的前面都有一個下個節點的指針,因此在一個節點上面,關鍵字的數量老是比節點的數量少一個;數據庫

三、每一個節點指針指向下一個節點。設計模式

二、MySQL索引分類?數組

一、普通索引index:加速查找;緩存

二、惟一索引

    主鍵索引:primary key:加速查找+約束(不爲空且惟一);

    惟一索引:unique:加速查找+約束(惟一);

三、聯合索引

    -primary key(id,name);聯合主鍵索引

    -unique(id,name);聯合惟一索引

    -index(id,name);聯合普通索引

索引按照功能分類:

一、主鍵索引:一張表中最多有一個主鍵索引,且字段不能爲NULL,不能重複;

二、惟一索引:一張表中能夠有多個惟一索引,且字段能夠爲NULL,但不能有重複值;

三、普通索引:一張表中能夠有多個普通索引,且值能夠爲NULL,而且值能夠重複;

四、全文索引:全文索引就是將該字段的信息加以拆分和組合,造成一份清單,和sphinx全文索引同樣;

五、複合索引:一個索引若是創建在多個字段上,那該索引就稱爲複合索引。

說明:其實這些索引的數據結構都是同樣的B-Tree結構,只是他們對字段信息的約束條件不同。

四、索引的使用有了解?

使用索引應該知足左原則,如:

一、like查詢時,不能以通配符開始;

二、複合索引,若是想使用第二個關鍵字索引,那麼第一個關鍵字索引必需要肯定;

五、對A、B、C三個字段創建聯合索引,而後使用ABC三個字段查詢,哪一個字段會擊中索引?

根據查詢字段的位置不一樣來決定,如查詢A、A,B、A,B,C、A,C均可以走索引的,其它條件的查詢不走索引;組合索引有「最左前綴」原則,就是隻從最左面的開始組合,並非全部只要含有這三列存在的字段的查詢都會用到該組合索引。

六、ES處理數據?

ElasticSearch是一個開源的搜索引擎。

ES的簡介及使用:https://www.cnblogs.com/wihainan/p/7064943.html

七、Java中對象做爲參數傳遞,是傳值仍是傳引用?

在Java中,當對象最爲參數傳遞時,實際上傳遞的是一份「引用的拷貝」,即實際傳遞的是對象的引用。

八、new一個對象是如何存儲的?

堆內存是用來存放由new建立的對象和數組,即動態申請的內存都存放在堆內存中;

棧內存是用來存放在函數中定義的一些基本類型的變量和對象的引用變量;

如:new一個person,Person person = new Person();右邊部分new Person()保存在堆中,左邊對象的引用person保存在棧中。

九、解釋性SQL?

explain select name from table;explain顯示了MySQL如何使用索引來處理select語句以及鏈接表,能夠幫助選擇更好的索引和寫出更優化的查詢語句。

十、Linux命令查看文件大小?

ll -lht, ls -l

十一、Linux命令查看內存大小?

free -m

十二、Spring中的FactoryBean和BeanFactory的區別?

BeanFactory是個Factory,也就是IOC容器或對象工廠,FactoryBean是個Bean;

在Spring中,全部的Bean都是由BeanFactory(也就是IOC容器)來進行管理的;(這些bean爲普通bean)

但對FactoryBean而言,這個Bean不是簡單的bean,而是一個能生產或者修飾對象生成的工廠Bean,它的實現與設計模式中的工廠模式和修飾器模式相似。(非普通bean)

1三、分庫分表按照什麼規則?

清瀾山的智慧校園系統是按照業務實現分庫的,如人員數據庫、車輛數據庫、主數據數據庫等;

分表能夠水平分割、垂直分割;

水平分割:表中數據量大時,能夠適當的進行水平分割,將部分數據移動到另外一張表中;

垂直分割:表中字段過多時,能夠適當的進行垂直分割,將部分字段移動到另外一張表中。

1四、SpringBoot的啓動過程?

一、啓動類中調用:SpringApplication.run(xxx.class,args)方法;

二、在SpringApplication的run方法中有兩個步驟,首先建立SpringApplication對象,而後再調用run方法;

三、在SpringApplication構造器中調用initialize(sources)方法;

四、在initialize方法中:

  a、將sources轉換成list加到this.sources屬性中;

  b、判斷是否爲Web環境(在類路徑下是否能夠加載到Servlet和ConfigurableWebApplicationContext);

  c、加載initializers(經過META-INF/spring.factories中鍵爲 ApplicationContextInitialzer的配置進行加載),debug發現一共加載了6個initializer(spring-boot-1.5.10.RELEASE.jar中四個,autoconfigure-1.5.10-RELEASE.jar中兩個);

  d、加載ApplicationListener(也是經過META-INF/spring.factories),debug發現共加載了10個;

  e、經過尋找main方法找到主啓動類;

五、run方法中

  a、StopWatch主要時監控啓動過程,統計啓動時間,檢測應用是否已啓動或者中止;

  b、加載SpringApplicationRunListener(也是經過META-INF/spring.factories),默認加載的是EventPublishingRunListener;

  c、調用RunListener.starting()方法;

  d、根據args建立應用參數解析器ApplicationArguments;

  e、準備環境變量:獲取環境變量environment,將應用參數放入到環境變量持有對象中,監聽監聽器環境變量對象的變化;(listener.environmentPrepared)

  f、打印Banner信息;(SpringBootBanner)

  g、建立SpringBoot的應用上下文(AnnotationConfigEmbeddedWebApplicationContext)

  h、prepareContext 上下文以前的準備;

  i、refreshContext刷新上下文;

  j、afterRefresh(ApplicationRunner,CommandLineRunner 接口實現類的啓動);

  k、返回上下文對象;

1五、AOP和IOC採用的設計模式?

aop:代理模式;

ioc:工廠模式;

1六、在分佈式系統中如何合併多個服務的日誌?(每一個日誌文件大小約300M,合併成一個日誌文件)

使用歸併算法,能夠爲每一個文件分配一個40M的數組,再另外分配一個400M的數組存儲歸併結果,每一個文件每次讀取40M,對十個數組作歸併排序直到其中某個數組的數據被處理完,這時將歸併結果寫入磁盤,處理完的數組繼續讀入40M,繼續參與歸併,以此類推,直到全部文件都處理完。

1七、HashMap鏈表轉爲紅黑樹,爲何必定要鏈表長度爲8的時候呢?七、9它不能夠嗎?

選擇8是從時間複雜度考慮的,從8開始用樹效率更好;紅黑樹的平均查找長度,也就是時間複雜度log(n),長度爲8,查找長度log(8)=3,由於2的三次方是8;鏈表的平均查找爲n/2,當長度爲8時,平均查找長度爲8/2=4,這時纔有轉換成樹的必要,由於log(8)比8/2小,用樹結構須要的查找步數更小。

1八、HashMap擴容,爲何是以2的冪次方增加,不是三、4?

HashMap計算添加元素的位置時,使用的是位運算,這是特別高效的運算;另外,HashMap的初始容量是2的n次冪,擴容也是2倍的形式進行擴容,是由於容量是2的n次冪,只須要判斷高位hash,移動到以前到位置的倍數就能夠了,免去了從新計算位置的運算,可使得添加的元素均勻分佈在HashMap中的數組上,減小hash碰撞,避免造成鏈表的結構,使得查詢效率下降。

1九、HashMap初始化容量設置多少合適?若是設置爲7,其容量是多少?

當咱們使用HashMap(int initialCapacity)來初始化容量的時候,HashMap並不會使用咱們傳進來的initialCapacity 值直接做爲初始容量;JDK會默認幫咱們計算一個相對合理的值看成初始容量,就是找到第一個比用戶傳入的值大的2的冪;如當咱們new HashMap(7)建立HashMap的時候,JDK會經過計算,幫咱們建立一個容量爲8(2的三次冪)的Map;當咱們new HashMap(9)建立HashMap的時候,DK會經過計算,幫咱們建立一個容量爲16(24)的Map。因此,能夠根據業務需求來給HashMap設置一個初始化容量,若是明確知道一個HashMap的容量爲7時,能夠經過newHashMapWithExpectedSize(7)建立HashMap;

Map<String,String> map = Maps.newHashMapWithExpectedSize(7);

 經過該方法建立Map就不會致使HashMap自動擴容,影響性能,是一種用內存換性能的作法。

20、鎖的底層原理?爲何可以鎖住?

一、synchronized是經過監視器鎖(monitor)實現的;

二、Lock底層是經過AQS實現的,採用線程獨佔的形式,在硬件層面依賴特殊的CPU指令(CAS);簡單來講ReenTrantLock的實現是一種自旋鎖,經過循環調用CAS操做來實現枷鎖;

三、在JVM底層volatile是採用「內存屏障」來實現的。

2一、Mybatis的二級緩存及原理?

Mybatis默認開啓一級緩存,支持在同一個會話(sqlsession)同一個statement執行兩次,則第二次會默認使用第一次建立的緩存對象;一級緩存是sqlsession級別、二級緩存是Mapper級別;Mybatis在爲SqlSession對象建立Executor對象時,會對Executor對象加上一個裝飾者:CachingExecutor,這時SqlSession使用CachingExecutor對象來完成操做請求CachingExecutor對於查詢請求,會先判斷該查詢在Application級別的二級緩存中是否有緩存結果,若是有查詢結果,則直接返回緩存結果;若是緩存中沒有,再交給真正的Executor對象來完成查詢操做,以後CachingExecutor會將真正Executor返回的查詢結果放置到緩存中,而後再返回給用戶;CachingExecutor是Executor的裝飾者,以加強Executor的功能,使其具備緩存查詢功能,這裏用到了設計模式中的裝飾者模式。

2二、既然紅黑樹這麼好,爲何不一開始就直接用紅黑樹代替鏈表?

由於紅黑樹須要左旋、右旋操做,而單鏈表不須要;當個數很少的時候,直接遍歷更方便,實現起來也簡單,而紅黑樹的實現要複雜的多。

 

 

爲了避免死,我願獻出生命

相關文章
相關標籤/搜索