1. 程式人生 > >第一篇部落格:京東集團java研發實習面經

第一篇部落格:京東集團java研發實習面經

注:今天在牛客網看了一位大牛的面經,也可以說是2018年的總結。深有感觸,再看看我的部落格簡直是浪費了部落格這個交流平臺,所以也準備追尋大牛的腳步,分享和記錄一些學習中學到的知識和心得。

大牛面經傳送門:
https://www.nowcoder.com/discuss/137593?type=2&order=0&pos=6&page=5

正題:有幸參加了2018年秋季京東集團的java實習生招聘,並拿到了offer,特此記錄:

因為走的是內推,所以直接到了部門面,沒去的時候我就覺得,能在部門內能擔任面試官的人一定是部門內的大牛,果不其然,面試官感覺會的東西特別多,思維也很發散,問的很多問題都是後臺實際開發中遇到過的。 關於技術問題,主要有如下幾個方面,當時回答的也不是特別好,答案僅供參考:

1 有什麼良好的程式設計習慣和程式碼風格
答:在編寫程式碼的時候使用註釋和文件註釋,介面會寫對應測試類,命名時遵循命名方法,儘量做到見名知意,程式設計的時候會考慮程式的效能問題,比如在hashMap時會進行響應的賦初值,避免記憶體洩漏,不使用魔法值,使用程式碼規約外掛等等

2 泛型可以被繼承嗎?舉個例子
可以被繼承

public class Test {
  public static void main(String[] args) {
    Demo<ArrayList> demo = new Demo<>();
    ArrayList arr = new ArrayList();
    arr.add(1);
    arr.add(2);
    arr.add(3);
    demo.test(arr);
  }
}

class Demo<T extends Collection> {
  public void test(T t){
    System.out.println(t.toString());
  }
}

3 JVM記憶體模型的理解
當時說了一下分割槽,這個網上說的都比我全,這裡就不贅述了

4 用過那些資料結構,談談你的理解
用過ArrayList LinkedList HashSet HashMap TreeMap TreeSet LinkedHashMap
理解大概說了一下使用場景,比如LinkedHashMap 可以實現LRU的快取策略,HashMap也可以做快取,講了一下結構,介紹了一下雜湊一致性和紅黑二叉樹,每個集合都做了一些簡單的介紹,講了一下繼承結構,也說了一下自己沒用過但是知道的比如Queue Stack HashTable這種執行緒安全的集合,這部分介紹的比較多,因為準備的比較充分吧,知道面試官一般都喜歡問。

5 mysql資料庫多個欄位都存在索引時,查詢操作時應注意哪些問題
這個當時說的時在建立多列索引時,要根據業務需求,where子句中使用最頻繁的一列放在最左邊,這樣才能高效的去使用索引,還有就是比如一個欄位被添加了索引 like %a 這樣不會用到索引,in not in >= 等等 這些操作也不會用到索引,都會引發全盤掃描,對索引知之甚少。

6 是否自己寫mapper/dao/pojo?有沒有可以自動生成的方法
通用mapper generator MybatisPlus都可以生成,當時使用最多的是Mybatis的通用Mapper,是基於攔截器+反射的方式,但是後來generator比較常用,用了才知道,它是真的好用

7 mybatis攔截器的使用
這個沒答上來,因為真的沒用使用過

8 spring mvc中如何使用自定義的註解
這個非常遺憾也沒答上來,說了一下自定義註解的方法,@interface 加上設定保留策略和作用位置

9 mysql事務的底層實現原理
這個也沒答上來,但是給面試官講了一下作業系統中的PV原語,感覺可能比較相似吧,尷尬啊。

10 mysql中innodb的索引結構
聚集索引,順便介紹了一下B+tree

11 mysql中鎖的應用
說了一下行級鎖和表級鎖

12 如何自定義資料庫連線池
實現DataSource介面,然後使用一個數據結構來儲存資料庫連結,這裡我使用的是ArrayList,獲取連結的使用remove,關閉的時候,add

13 假設自定義的資料庫連線池有10個空閒連結,此時共有12個連結請求,剩下2個連結如何處理,如果想實現等待,如何去設計。
接上一問,不等待的方法,可以設定一個判定,如果檢測到沒可用連結,就將儲存資料庫連結的資料結構大小翻倍,再建立連結,獲取
等待的方法,可以使用一個佇列,因為佇列是一種FIFO的資料結構,這樣直到有可用連線返回,再做出隊操作,獲取連結

14 是否進行過sql優化,具體說一下如何優化的
進行過,避免使用外來鍵,設定自增主鍵避免page分頁,避免使用外連線,涉及到sql的運算操作,將運算上移至Service,用java程式碼處理。可減輕資料庫的壓力,還可以進行分庫分表操作等,使用redis快取,MQ等減緩資料庫壓力。

15 常用的編譯工具,經常使用的快捷鍵
之前是eclipse 問了一些快捷鍵,這個有點忘了

16 voltile和synchronize的區別
volatile是執行緒同步的輕量級實現,所以volatile的效能要比synchronize好;volatile只能用於修飾變數,synchronize可以用於修飾方法、程式碼塊, synchronize注重的是執行緒同步,volatile注重的是可見性

17 CMS和G1瞭解麼,CMS解決什麼問題,說一下回收的過程。
瞭解,CMS可以有效的去避免STW現象,介紹了一下可達性分析,簡單的說了一下標記-清楚,標記-複製,標記-整理這幾種演算法,這個網上說的肯定比我的全,就不贅述了。

18 SSM中前後端互動問題,json在其中的作用,它是如何在前後端進行傳遞的?
Json做的是前後端的資料互動,json是一種字串格式,沒用json物件這一概念,它可以由前端轉換成js物件,可以傳到其他語言開發的專案中進行資料處理。前端可以用ajax來非同步提交請求,將資料傳入controller,後端可以封裝好json,供前端進行解析,封裝的方式常見的由jackson fastjson 前者自動轉換,後者是阿里的,不能進行自動轉換,需要配置轉換器,但是效率更高

19 不同專案中可能用到的jar包版本不同,在發生版本衝突的時候,如何去解決
Sping-boot可以做統一的jar包管理,再使用maven開發專案的時候,也可以用父工程來約定jar包版本,如果是已經執行的專案,可以進行改版,檢視jar包相容性做對應的修改(這個答得不太好,並不是面試官想要的答案)

20 如何把自己的jar包上傳至maven
這個沒用答上來,但是講了一下maven在專案中如何使用,如何管理jar包等

21 javascript和前端的東西也問了一些
Js是基於物件,沒有類的概念,但是有物件的概念,所以不叫面向物件,叫基於物件。

總結:面試過程中提問只佔了一部分,還有一部分是自己介紹簡歷上的技術,後面也自己介紹了一些中介軟體的原理和使用,但是感覺在整個面試過程中面試官更重視的是基礎。問問題之前問了一下在學校獲得的獎項和發表論文的內容,感覺面試官思維特別嚴謹,因為我在學校主要做硬體,所以問了一些硬體相關的知識,可惜之前沒有接觸過,沒能答上來,比較遺憾。公司效率也特別高,很快就收到了offer如願以償進入了公司,祝大家都能找到心儀的工作