1. 程式人生 > >2017秋招京東Java工程師面經

2017秋招京東Java工程師面經

1、面經分享連結

2、基礎

Java8新特性

建立執行緒的三種方式

  • 繼承Thread類建立執行緒類

    1. 定義Thread類的子類,並重寫該類的run方法,該run方法的方法體就代表了執行緒要完成的任務。因此把run()方法稱為執行體。
    2. 建立Thread子類的例項,即建立了執行緒物件。
    3. 呼叫執行緒物件的start()方法來啟動該執行緒。
  • 通過Runnable介面建立執行緒類

    1. 定義runnable介面的實現類,並重寫該介面的run()方法,該run()方法的方法體同樣是該執行緒的執行緒執行體。
    2. 建立 Runnable實現類的例項,並依此例項作為Thread的target來建立Thread物件,該Thread物件才是真正的執行緒物件。
    3. 呼叫執行緒物件的start()方法來啟動該執行緒。
  • 通過Callable和Future建立執行緒

    1. 建立Callable介面的實現類,並實現call()方法,該call()方法將作為執行緒執行體,並且有返回值。
    2. 建立Callable實現類的例項,使用FutureTask類來包裝Callable物件,該FutureTask物件封裝了該Callable物件的call()方法的返回值。
    3. 使用FutureTask物件作為Thread物件的target建立並啟動新執行緒。
    4. 呼叫FutureTask物件的get()方法來獲得子執行緒執行結束後的返回值

inner join,left join,rigth join的區別

為什麼資料庫表中需要主鍵

  • 主鍵的作用:唯一標識表中每一行
  • 便於對錶中特定的行進行更新或刪除
  • 表中任意列都可以作為主鍵,但是需要滿足以下條件:
    1. 任何兩行都不具有相同的主鍵值
    2. 每個行都必須具有一個主鍵值(主鍵列不允許NULL值)

索引的型別,怎麼實現的?

3、Spring框架

Spring是什麼

  • 內部最核心的就是IOC了,控制反轉,讓一個物件的建立不用new了,可以自動的生產,這其實就是利用java裡的反射,反射其實就是在執行時動態的去建立、呼叫物件,Spring就是在執行時,跟xml Spring的配置檔案來動態的建立物件和呼叫物件裡的方法的 。
  • Spring還有一個核心就是AOP這個就是面向切面程式設計,可以為某一類物件 進行監督和控制(也就是 在呼叫這類物件的具體方法的前後去呼叫你指定的 模組)從而達到對一個模組擴充的功能。這些都是通過 配置類達到的。

Hibernate物件的三種狀態

4、設計模式,JVM

4.1 設計模式

裝飾模式和介面卡模式的區別?

答:從兩個設計模式的實現功能、實現方式說
* 裝飾模式是為能夠動態的擴充套件物件的功能,是繼承關係的一個替代方案,提供比繼承更多的靈活性。
* 介面卡就更好理解了,介面卡是對其他物件介面的一種轉換行為,將原介面轉換為目標介面,以達到適配的效果。再從設計模式的實現方式來講,具體的內容可以從這裡得到,講的很詳細,本文中我就不再贅述了。
* 好文分享:http://blog.csdn.net/zhangerqing/article/details/8239539

4.2 JVM

重量級鎖與輕量級鎖的區別

首先簡單說下先偏向鎖、輕量級鎖、重量級鎖三者各自的應用場景:偏向鎖:只有一個執行緒進入臨界區;輕量級鎖:多個執行緒交替進入臨界區;重量級鎖:多個執行緒同時進入臨界區。還要明確的是,偏向鎖、輕量級鎖都是JVM引入的鎖優化手段,目的是降低執行緒同步的開銷。比如以下的同步程式碼塊:synchronized (lockObject) {
// do something
}

  • 重量級鎖:執行緒同步過程中需要進行互斥開銷的鎖
  • 輕量級鎖:在沒有多執行緒競爭的前提下,減少傳統的重量級鎖使用互斥量產生的效能消耗,即使用CAS操作消除同步使用的互斥量。

悲觀鎖與樂觀鎖的區別

  • 悲觀鎖:總是認為只要不去做正確的同步措施,就會出現執行緒不安全的問題,無論共享資料是否真的發生競爭,它都要加鎖、使用者態核心態轉換、維護鎖計數器和檢查是否有被阻塞的執行緒需要喚醒等操作。
  • 樂觀鎖:先不加鎖進行操作,如果沒有其他執行緒爭用共享資料,那操作就成功了;如果共享資料有爭用,產生了衝突,那就採用其他的補償措施。

悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。

樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿資料的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個資料,可以使用版本號或者時間戳等機制。樂觀鎖適用於多讀的應用型別,這樣可以提高吞吐量,像資料庫如果提供類似於write_condition機制的其實都是提供的樂觀鎖。

像樂觀鎖適用於寫比較少的情況下,即衝突真的很少發生的時候,這樣可以省去了鎖的開銷,加大了系統的整個吞吐量。但如果經常產生衝突,上層應用會不斷的進行retry,這樣反倒是降低了效能,所以這種情況下用悲觀鎖就比較合適。

共享鎖與排他鎖的區別

  • 共享鎖:允許事務讀一行資料
  • 排他鎖:允許事務刪除或更新一行資料

4、WEB

4.1 Java web過濾器的生命週期

  • Servlet的生命週期:

    1. 啟動伺服器時載入Servlet的例項;
    2. 第一次訪問時呼叫init()方法來初始化例項;
    3. 從第一次到以後的多次訪問,都是隻呼叫doGet()或doPost()方法;
    4. 停止伺服器時呼叫destroy()方法,銷燬例項。
  • 過濾器:
    過濾器的生命週期:(一定要實現javax.servlet包的Filter介面的三個方法init()、doFilter()、destroy(),空實現也行)

    1. 啟動伺服器時載入過濾器的例項,並呼叫init()方法來初始化例項;
    2. 每一次請求時都只調用方法doFilter()進行處理;
    3. 停止伺服器時呼叫destroy()方法,銷燬例項。

4.2 HTTP與HTTPS的區別

簡單來說,HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,要比http協議安全。
HTTPS和HTTP的區別主要如下:
1. https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。
2. http是超文字傳輸協議,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協議。
3. http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。
4. http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。

5、Linux,作業系統

5.1 linux統計一個文字中出現的單詞數量

[[email protected] ~]# wc /etc/passwd
46   66 2027 /etc/passwd
行數 單詞數 字元數 檔名

-l 行數
-w 單詞數
-c 字元數

6、演算法

6.1 大數的加法

void Add(char s1[],char s2[]) //需要兩個字串引數&&無返回值
 {
     int num1[M],nm2[M];
     int i,j;
     len1=strlen(s1);
     len2=strlen(s2);
     for(i=len1-1,j=0;i>=0;i--)//num[0]儲存的是低位
             num1[j++]=s1[i]-'0';
     for(i=len2-1,j=0;i>=0;i--)
             num2[j++]=s2[i]-'0';
     for(i=0;i<M;i++)
     {
         num1[i]+=num2[i];
         if(num1[i]>9)
         {
             num1[i]-=10;
             num1[i+1]++;
         }
     }

  for(i=M;(i>=0)&&(num1[i]==0);i--)//找到第一個不是零的數
    {
        if(i>=0)
            for(;i>=0;i--)
                printf("%d",num1[i]);
        else
            printf("0\n")
    }

7、專案,大資料

高併發