個人Java面試常見題目記錄

Java高頻面試問題總結


下面是本人在面試Java實習的過程中碰到的一些面試題,當然,只是自己記得的印象較深的一些題,還有很多的其他的技術問題,也包括一些非技術問題,後續還會繼續記錄。

Java基礎

包括JavaSE、多線程、併發、集合和JVM等常見問題

(1)java中有哪些基本數據類型?

  • 整數類型:byte short int long

  • 浮點數類型:float double

  • 字符型:char

  • 布爾型:boolean

  • 注意:java還爲每一種基本類型提供了相應的包裝類,基本類型與包裝類型的主要區別在於1、包裝類型允許值爲空,而基本類型不允許爲空;2、包裝類型是一個對象,需要消耗更多的內存,也給GC帶來了更大的壓力,所以在性能上稍差一截。

(2)如何控制多個線程按一定順序執行?

  • 1 使用join()方法,僞代碼如下:
Thread thread1 = new Thread(new Runnable(){
    @Override
    public void run(){
        //自定義代碼塊
    }
})

Thread thread2 = new Thread(new Runnable(){
    @Override
    public void run(){
        threa1.join()  //保證該線程在thread1之後執行
        //自定義代碼塊
    }
})

  • 2 使用對象的wait()和notify()方法
  • 3 使用線程池的submit()方法,僞代碼如下:
ThreadPoolExecutor threadpool = new ThreadPoolExecutor(各個初始參數);
Thread thread1 = new Thread(線程對象參數);
Thread thread2 = new Thread(線程對象參數);
Thread thread3 = new Thread(線程對象參數);
threadpool.submit(thread1);
threadpool.submit(thread2);
threadpool.submit(thread3);
  • 4 使用ReentrantLock結合condition控制線程順序執行
  • 5 使用CountDownLatch(遞減,只能使用一次)或者CyclicBarrier(遞增,可重複利用)
  • 6 使用Semaphone信號量控制線程順序執行

(3)創建線程有哪幾種方式?

  • 1 繼承Thread類並重寫run()方法
  • 2 實現Runnable接口並重寫run()方法
  • 3 實現 Callable接口並重寫call()方法
  • 4 使用線程池的方式

(4)實現線程安全的方式有哪些?

  • 1 使用synchronized關鍵字(包括同步方法和同步代碼塊)
  • 2 使用鎖(ReentrantLock)
  • 3 使用volatile關鍵字
  • 4 使用原子類

(5)什麼時候會觸發GC?

  • 當堆中的新生代中的Eden區沒有足夠的空間爲新的對象分配內存的時候會觸發MinorGC
  • 當新生代中的S0和S1中相同年齡的對象所佔內存超過S0和S1總內存的一半的時候會觸發MinorGC
  • 當老年代中無法爲S1中的對象騰出新的內存的時候會觸發fullGC
  • 當老年代中無法爲新的大對象分配內存的時候會觸發fullGC

(6)同一個類中,普通方法和靜態方法在獲取鎖上有什麼區別?

  • 普通方法指向的鎖是this,亦即對當前類上鎖
  • 靜態方法指向的鎖是this.class,亦即對當前類的實例上鎖

(7)volatile和syncyronized的區別

(8)類加載機制

框架和中間件

包括Netty、Redis、kafka、spring、springboot等框架和中間件相關的常見問題

數據結構及計算機網絡

包括數據結構和常用算法、計算機網絡基礎知識、常用網絡協議等相關知識問題

數據庫

(1)如何優化數據庫性能?

個人認爲,優化數據庫的性能的目的主要是爲了提高SQL響應速度。所以,數據庫性能的優化可以從下面的步驟進行:

  • 1 首先是找到那些SQL響應慢的語句,然後檢查是否可以在程序代碼中做優化;
  • 2 通過數據庫的一些檢測工具檢查SQL慢的原因,如慢查詢日誌、show status、show global status、show profiles、explain等工具。然後根據檢測結果來一一排查問題
  • 3 考慮是否系統中的緩存是否部分失效或掛掉,系統中是否存在外部調用延時從而導致SQL響應時間變慢
  • 4 考慮是否可以通過創建合適的索引來提升查詢效率
  • 5 數據表的結構是否可以做進一步的優化,如數據字段類型優化,垂直分表等
  • 6 數據庫系統的參數配置是否合理,操作系統的配置是否合理
  • 7 服務器的性能是否受到其他程序的影響
  • 8 如果是由於數據表數據量過大造成的,那麼是否可以考慮水平分表,分庫,分佈式集羣等。

(2)數據庫中常見的索引有哪些?

  • 1 按照索引的數據結構來劃分的話有:B-tree索引及其變體、hash索引、R-tree索引、K-D樹索引、全文索引和倒排索引等
  • 2 對於使用基於B+tree的Innodb引擎的MySQL來說有如下索引:主鍵索引、唯一索引、聯合索引(包含多個列的索引)、前綴索引、後綴索引、覆蓋索引及自適應哈希索引。

(3)聚簇索引和非聚簇索引的區別是什麼?

  • 聚簇索引根據索引列的值來有序地緊湊存儲數據行記錄,這意味着通過聚簇索引列來查詢數據是非常快的,因爲不需要做回表查詢就可以直接拿到整行記錄的所有值;
  • 非聚簇索引則只存儲該索引列的鍵值,所以如果使用非聚簇索引來查找行記錄,那麼首先能拿到只有該索引列的鍵值,然後再回表查詢其餘列的值,進而得到整行記錄的所有值;
  • 在MyIsam存儲引擎中,是不存在聚簇索引的,即使是主鍵索引也不屬於聚簇索引,主鍵索引和其他索引沒什麼區別,只是名字不同罷了。MyIsam存儲引擎底層使用B-Tree實現索引,它的每個索引節點都存儲了指向對應索引列鍵值的指針作爲節點的值(也就是說,節點只緩存索引,真正的數據需要通過操作系統根據指針調用來找到)所以它需要兩次索引才能找到找到需要查找的記錄;
  • 在Inodb中,支持以主鍵爲索引列的聚簇索引,並且一張表只能有一個聚簇索引(所以一張表只能有一個主鍵)。建議使用自增的列作爲主鍵,這樣在數據表插入數據的時候纔能有序插入到內存頁從而有序的寫入到磁盤,在取數據的時候才能按順序從磁盤加載到內存中,即將隨機IO變爲了順序IO;當然,還建議主鍵列的字段應該不要太大,因爲越小,則一個數據頁能存儲的數據就越多,從而可以減小IO,進而提高查詢效率。

算法

  • 有一個整數數組,裏面的整數都是成對出現的,但是隻有一個數字是隻出現一次的。如何快速地找出這個數字?

解答:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章