京東後臺面試(很全面,很符合現在的面試!!)

Java筆試面試目錄(一個大佬的總結)https://blog.csdn.net/weixin_41835916/article/details/81413498

1.自我介紹。
2.畫出項目的架構圖,對每層進行解釋,爲何用MVC分層。
在這裏插入圖片描述

3.exception異常處理結構,常見異常,多catch處理順序。

4.對多個表的操作,用事務操作如何實現,寫代碼

5.maven瞭解嗎

6.死鎖

OPPO麪筋集合14題:https://blog.csdn.net/weixin_39345957/article/details/89000440

7.tomcat如何部署,war包結構,發佈工具.

8.jvm相關原理,垃圾回收算法。

常用的垃圾回收算法有:
1. 引用計數法(經典算法)
對於對象設置一個引用計數器,每增加一個對該對象的引用,計數器+1,引用失效則-1.當計數器爲0時,對象死亡,被回收。
存在問題:

  • 對象內部頻繁的加減操作,會一定程度上增加系統消耗
  • 無法解決對象循環引用的問題(A中引用B,B中引用A,此時兩個對象的計數器均不爲0,A=NULL,B=NULL本該無效了,但是卻無法回收,導致內存泄漏)

2. 標記清除法
該方法分爲兩個階段:標記和清除
標記階段:通過可達性算法,跟蹤對象,標記所有和GCRoots節點相關聯的對象,剩餘沒有被標記的對象則爲需要回收的對象。
清除階段:清除未被標記的對象。
可達性算法分析時,需要兩次標記(finalize)
存在問題:
垃圾回收後可能會產生大量的內存碎片,使得如果有一個大內存對象到來,可能會提前觸發一次GC。

3. 標記整理法(老年代)
分爲三個階段:標記,整理,清除
標記
整理:將標記後的對象統一往內存的一端移動
清除: 清除端以外的內存
存在問題:
整理對象階段佔用了系統的消耗,並且如果標記對象很多,會導致損耗很大。標記對象相對較少的時候,效率較高

4. 複製算法(新生代)
核心思想是將內存空間分成兩塊,同一時刻只使用其中的一塊,在垃圾回收時將正在使用的內存中的存活的對象複製到未使用的內存中,然後清除正在使用的內存塊中所有的對象,
然後把未使用的內存塊變成正在使用的內存塊,把原來使用的內存塊變成未使用的內存塊。很明顯如果存活對象較多的話,算法效率會比較差,並且這樣會使內存的空間折半,但是這種方法也不會產生內存碎片。
5. 分代法(常用於java堆)
根據對象的生命週期長短特點,進行分塊。根據每塊內存區間的特點,是喲個不同的回收算法,從而提高垃圾回收的效率。
比如Java虛擬機中的堆就採用了這種方法分成了新生代和老年代。然後對於不同的代採用不同的垃圾回收算法。
新生代使用了複製算法,老年代使用了標記壓縮清除算法。

6. 分區算法
將整個空間劃分爲連續的不同小區間,每個區間都獨立使用,獨立回收,好處是可以控制一次回收多少個小區間(G1)

9.寫sql語句,主要考察group by/having/count等

10.消息隊列了解嗎。

11.貝葉斯算法。

12.java數據結構。

13.hashmap結構,

14.arraylist和linkedlist區別。(×2)

15.線程同步如何實現,

JAVA多線程——實現同步:https://blog.csdn.net/weixin_38719347/article/details/81219514

16.reentrantlock跟synchronized區別。

https://www.cnblogs.com/baizhanshi/p/7211802.html

17.線程池,原理和實現。

18.負載均衡算法。

https://www.cnblogs.com/will-shun/archive/2017/09/22/7574644.html

19.數據庫,查詢優化,
20.事務隔離級別,你項目中用的什麼隔離級別,用讀提交可以嗎。
21.SpringMVC的工作原理/MVC是做什麼的,有什麼好處 (×2)

SpringMVC工作原理:https://www.cnblogs.com/xiaoxi/p/6164383.html

22.有哪些註解

springmvc 註解總結:https://www.cnblogs.com/xiaoxi/p/5718894.html
JAVA 註解的基本原理:https://www.cnblogs.com/yangming1996/p/9295168.html
註解工作原理詳解:https://www.cnblogs.com/lyxcode/p/9377897.html

  • @RequestMapping:一個用來處理請求地址映射的註解(將請求映射到對應的控制器方法中)

    • 在其中可以設置具體的訪問變量和訪問的方法post還是get@RequestMapping(value="/get/{bookid}",method={RequestMethod.GET,RequestMethod.POST})
  • @RequestParam綁定單個請求參數值,用於將請求參數區數據映射到功能處理方法的參數上。

  • @PathVariable綁定URI模板變量值,用於將請求URL中的模板變量映射到功能處理方法的參數上

    • @RequestMapping(value="/users/{userId}/topics/{topicId}")
      public String test(
      @PathVariable(value=“userId”) int userId,
      @PathVariable(value=“topicId”) int topicId)
  • @ModelAttribute

23.如何實現一個線程
24.線程由什麼構成
25.線程和進程的區別
26.java的基礎類型
27.equals和==
28.tcp與udp
29.list和set的區別
30.有有序的set嗎
31.String StringBuilder StringBuffer的區別(常量池)
32.jvm垃圾回收算法 垃圾回收器
33.hashmap的幾個方法
34.快排的最好和最壞複雜度
35.java多線程有哪幾種實現方法
36.CountDownLatch
37.關於數據庫事務說出你知道的所有
38.登陸驗證問題

39.concurrent包的技術全部說出來(volatile、鎖重入,LinkedTransferQueue字節追加提高併發度技術,ConcurrentHaspMap結合volatile的happen-before讀取優化)

Concurrent包詳解及使用場景:http://www.cnblogs.com/chuijingjing/p/10072912.html
Concurrent包中類的詳解:https://blog.csdn.net/masterlinsp/article/details/78756617

40.websocket長連接問題
41.秒殺業務場景設計(事務,邏輯調整,行級鎖,數據庫併發度、mybatis調用存儲過程)

42.mysql講一下索引。爲什麼組合索引是最左前綴匹配的

mysql索引最左匹配原則的理解?https://blog.csdn.net/gettogetto/article/details/70499157

  1. java的基本類型

44.final都是怎麼用?

45.throws throw 怎麼用?

46.hashmap原理?爲什麼每次擴容都是擴大一倍爲什麼不是三倍四倍?

47.二叉樹的遍歷

48.快排

49.堆排,如果從若干數中找最大N個數用最大堆還是最小堆?
50.數據庫瞭解嗎?

51用過什麼框架?
520.HTTP TCP UDP 的區別,具體用在哪些場景。
53說一下 java中的隊列 set map 區別,java裏的數據結構。講講它們的實現。
54.static關鍵字的作用
55 final 修飾 屬性 類 方法都有什麼作用
56. abstract 等關鍵字的作用,什麼時候用
57. 子類中如何調用父類的構造器,如果不用super關鍵字呢?有其他的方式嗎?
58. .如果兩個線程都使用一個ByteBuf 怎麼保證它的安全,具體說一下代碼實現
59. 好來說一下數據結構,有一個很長的鏈表,找出倒數第k個元素。 不用兩個指針呢?他們之前有什麼區別?面試官更想聽你說的第二種實現。
60. .二叉樹的前序遍歷,說下怎麼實現,不用遞歸實現呢? 還有其他的方式嗎?它們的區別
61. hashCode和equals方法的區別與聯繫
62. HashMap的底層實現
63. AOP的思想,
64. Spring注入的方式
65. linux權限控制
66. Mysql數據庫優化方式
67. 介紹快速排序
68. 版本控制工具,
69. jvm堆棧靜態區分別存儲的內容
70. 創建線程的4中方式

71 . sleep和wait的區別

  • sleep:是Thread的靜態方法,wait是Object的成員方法
  • sleep可以在任何地方使用,wait只能在同步方法或者同步方法快中使用
  • sleep和wait使用後都會暫停當前線程並出讓cpu資源。區別在於:sleep不會釋放鎖,時間到後會繼續執行;wait會釋放鎖並且需要notify/notifyAll方法喚醒後,重新競爭鎖之後纔可以進行
  • sleep需要捕獲/拋出異常;wait/notify/notifyAll不需要
  • sleep方法是單線程的,沒有釋放鎖指的是線程鎖;wait指的是對象鎖
  1. 數據結構 list set 具體到arraylist linkedlist vector的區別
  2. hashset的實現,
  3. hashmap的實現
  4. StringBuilder Stringbuffer
  5. 重寫和重載
  6. 三個線程的實現方式
  7. 線程中的同步
  8. 前臺中有兩個輸入框a和b 在a輸入框輸入數據並且點擊一按鈕後b輸入框響應顯示a的數據,然後點擊一個按鈕後,將數據提交到後臺,後臺處理後返回前臺,具體的邏輯過程

80. 線程的生命週期

在這裏插入圖片描述
81. 遞歸

1.設計一個高可用性數據庫架構

數據庫高併發高可用架構設計:https://blog.csdn.net/weixin_42684977/article/details/84147354

2.Linux命令 top

Linux top命令的用法詳細詳解:https://www.cnblogs.com/zhoug2020/p/6336453.html

3.常見排序算法

數據結構常見的八大排序算法(詳細整理):https://www.jianshu.com/p/7d037c332a9d?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=weixin-friends

在這裏插入圖片描述
4.常見的八大數據結構

5.10w個數字,你如何找出一個最大的那個數字呢?

5.1最大堆和最小堆的定義

5.2爲什麼選用最小堆

5.3 堆的複雜度(建堆,插入,調整)

5.4 如果找到前20個,時間複雜度是多少

5.5如果前20個正好是最大的20,複雜度 是多少

6.瀏覽一個網址,背後都處理了什麼

解析:

(1)輸入地址

(2)瀏覽器查找域名的 IP 地址

這一步包括 DNS
具體的查找過程,包括:瀏覽器緩存->系統緩存->路由器緩存…

(3)瀏覽器向 web 服務器發送一個 HTTP 請求

(4)服務器的永久重定向響應(從 http://example.comhttp://www.example.com

(5)瀏覽器跟蹤重定向地址

(6)服務器處理請求

(7)服務器返回一個 HTTP 響應

(8)瀏覽器顯示 HTML

(9)瀏覽器發送請求獲取嵌入在 HTML 中的資源(如圖片、音頻、視頻、CSS、JS等等)

(10)瀏覽器發送異步請求

7. 什麼是DNS,一定會執行DNS?

詳解DNS域名解析全過程:https://blog.csdn.net/m0_37812513/article/details/78775629

8. 長連接和短鏈接

HTTP的長連接和短連接:https://www.cnblogs.com/cswuyg/p/3653263.html

  1. HTTP和TCP和UDP,特點和應用場景

10. set如何保證不重複

Set中的元素爲什麼不允許重複:https://blog.csdn.net/chenjian98306/article/details/50331645
HashSet類是如何實現添加元素保證不重複的—哈希碼的原理https://blog.csdn.net/u010698072/article/details/52802179

11. hashmap如何保證key不重複

從源碼分析HashSet / HashMap是如何保證不重複的?:https://www.jianshu.com/p/fb1727bbf555

12. java中都有什麼鎖

java中的鎖https://www.cnblogs.com/5207/p/5917353.html
java中的鎖有哪幾種:https://blog.csdn.net/u012045045/article/details/84395912

13. spring的事務傳播

Spring事務傳播機制:https://www.cnblogs.com/softidea/p/5962612.html
【Spring學習34】Spring事務(4):事務屬性之7種傳播行爲:https://blog.csdn.net/soonfly/article/details/70305683

  1. 說說cas算法以及應用 ABA

  2. concurrenthashmap原理

  3. .synchronized實現原理、範圍、如何用?

  4. 說說spring

  5. 抽象類和接口的區別?若抽象類支持多繼承,接口還有存在的意義麼?

  6. 棧實現四則運算

  7. 面向對象的思想是什麼

  8. 你對Java 語言的看法

  9. 單CPU情況下,單線程與多線程的效率對比?

  10. Spring 默認的 bean 是單例還是多例?如何改成多例?爲什麼是單例

24. Spring bean的生命週期

Spring Bean的生命週期(非常詳細)https://www.cnblogs.com/zrtqsk/p/3735273.html
Java面試–Spring中的Bean的作用域和生命週期:https://blog.csdn.net/weixin_41835916/article/details/81906366

25. 線程的調度算法有哪些?

1)先來先服務調度算法(FCFS) 每次調度都是從後備作業隊列中選擇一個或多個最先進入該隊列的作業,將它們調入內存,爲它們分配資源、創建進程,然後放入就緒隊列。

2)短作業(進程)優先調度算法(SPF) 短作業優先(SJF)的調度算法是從後備隊列中選擇一個或若干個估計運行時間最短的作業,將它們調入內存運行。缺點:長作業的運行得不到保證

3)優先權調度算法(HPF) 當把該算法用於作業調度時,系統將從後備隊列中選擇若干個優先權最高的作業裝入內存。當用於進程調度時,該算法是把處理機分配給就緒隊列中優先權最高的進程,這時,又可進一步把該算法分成如下兩種。
可以分爲**:1.非搶佔式優先權算法 2.搶佔式優先權調度算法**

5)時間片輪轉法(RR) 在早期的時間片輪轉法中,系統將所有的就緒進程按先來先服務的原則排成一個隊列,每次調度時,把CPU分配給隊首進程,並令其執行一個時間片。時間片的大小從幾ms到幾百ms。當執行的時間片用完時,由一個計時器發出時鐘中斷請求,調度程序便據此信號來停止該進程的執行,並將它送往就緒隊列的末尾;然後,再把處理機分配給就緒隊列中新的隊首進程,同時也讓它執行一個時間片。這樣就可以保證就緒隊列中的所有進程在一給定的時間內均能獲得一時間片的處理機執行時間。換言之,系統能在給定的時間內響應所有用戶的請求。

6)多級反饋隊列調度算法
(1) 應設置多個就緒隊列,併爲各個隊列賦予不同的優先級。第一個隊列的優先級最高,第二個隊列次之,其餘各隊列的優先權逐個降低。該算法賦予各個隊列中進程執行時間片的大小也各不相同,在優先權愈高的隊列中,爲每個進程所規定的執行時間片就愈小。例如,第二個隊列的時間片要比第一個隊列的時間片長一倍,……,第i+1個隊列的時間片要比第i個隊列的時間片長一倍。
(2) 當一個新進程進入內存後,首先將它放入第一隊列的末尾,按FCFS原則排隊等待調度。當輪到該進程執行時,如它能在該時間片內完成,便可準備撤離系統;如果它在一個時間片結束時尚未完成,調度程序便將該進程轉入第二隊列的末尾,再同樣地按FCFS原則等待調度執行;如果它在第二隊列中運行一個時間片後仍未完成,再依次將它放入第三隊列,……,如此下去,當一個長作業(進程)從第一隊列依次降到第n隊列後,在第n 隊列便採取按時間片輪轉的方式運行。
(3) 僅當第一隊列空閒時,調度程序才調度第二隊列中的進程運行;僅當第1~(i-1)隊列均空時,纔會調度第i隊列中的進程運行。如果處理機正在第i隊列中爲某進程服務時,又有新進程進入優先權較高的隊列(第1~(i-1)中的任何一個隊列),則此時新進程將搶佔正在運行進程的處理機,即由調度程序把正在運行的進程放回到第i隊列的末尾,把處理機分配給新到的高優先權進程。

  1. 快排

  2. 一致性哈希

  3. 結合項目談談設計模式

  4. 觀察者模式

  5. 紅黑樹和avl樹的區別,爲什麼用紅黑樹實現map

爲什麼Java8中HashMap鏈表使用紅黑樹而不是AVL樹:https://blog.csdn.net/21aspnet/article/details/88939297

31. Jsp與Servlet的關係。

(1)jsp經編譯後就變成了Servlet.(JSP的本質就是Servlet,JVM只能識別java的類,不能識別JSP的代碼,Web容器將JSP的代碼編譯成JVM能夠識別的java類)

(2)jsp更擅長表現於頁面顯示,servlet更擅長於邏輯控制.

(3)Servlet中沒有內置對象,Jsp中的內置對象都是必須通過HttpServletRequest對象,HttpServletResponse對象以及HttpServlet對象得到.

Jsp是Servlet的一種簡化,使用Jsp只需要完成程序員需要輸出到客戶端的內容,Jsp中的Java腳本如何鑲嵌到一個類中,由Jsp容器完成。而Servlet則是個完整的Java類,這個類的Service方法用於生成對客戶端的響應。

32. 數據庫中有like,%like和like%什麼區別,索引的區別、

  1. 實現一個aop如何實現

34. 遍歷arrayList三種方法

ArrayList三種遍歷方式比較:https://blog.csdn.net/Jason_M_Ho/article/details/78725687

for
foreach
iterator如果只進行遍歷不做其他操作,那麼效率上:for>iterator>foreach
猜測:for>iterator的原因在於,使用迭代器每次獲取next的時候需要調用hasNext方法進行判斷。
爲什麼foreach最慢不知道

  1. Hashmap對null如何處理get(c) c並沒有加入到map中

  2. Java的優點(面向對象,三大特性:封裝、繼承、多態)分別體現

37. 訪問修飾符的作用範圍,爲什麼要有protected修飾符

JAVA編程語言中受保護的訪問修飾符protected分析:http://baijiahao.baidu.com/s?id=1600712630258756747&wfr=spider&for=pc
Java中訪問修飾符作用範圍:https://blog.csdn.net/dzb641973142/article/details/76178995

38. 接口和抽象類的區別

  1. Hashmap 底層原理以及get()和put()方法的底層實現,二者區別

40. 參數傳遞(值傳遞、引用傳遞)

Java的參數傳遞是「值傳遞」還是「引用傳遞」?:https://www.cnblogs.com/jiangxin007/p/9076696.html

41. 幾百萬條長短不一的數組,如何找出他們的公共部分(不會,說的方法很笨,後來問了同學,說

是用set或者Hashmap)

42. SpringMVC的九大組件

【SpringMVC】9大組件概覽:https://blog.csdn.net/hu_zhiting/article/details/73648939

43. ORM框架

ORM 框架簡介:https://www.cnblogs.com/wisdo/p/4279091.html
ORM框架簡介及優缺點:https://blog.csdn.net/orecle_littleboy/article/details/82458956

  1. IOC的設計原理和高級特性

45. AOP的設計原理

aop的實現原理就是java的動態代理,默認是jdk的動態代理

《Spring設計思想》AOP設計基本原理:https://blog.csdn.net/luanlouis/article/details/51095702
SpringIOC和AOP原理 設計模式 :https://www.jianshu.com/p/40d0a6ad21d2
面試問爛的SpringAOP原理,SpringMVC過程:https://blog.csdn.net/qq_42950313/article/details/83308152

46. FactoryBean和BeanFactory

BeanFactory 簡介以及它
和FactoryBean的區別(阿里面試):https://www.cnblogs.com/aspirant/p/9082858.html

47. 理解Spring循環引用(循環依賴)

這篇文章講的很透徹!!!,我總結了一下

理解Spring循環引用(循環依賴):https://blog.csdn.net/chen2526264/article/details/80673598

循環依賴:
也叫循環引用,即在Spring容器中,將A注入到B中,同時也將B注入到A中。
考慮循環依賴帶來的問題,首先分析多種情況排列組合:

  • 依賴注入的兩種方式:構造器和屬性
  • bean的作用域:singleton和prototype
  • bean的加載方式:立即加載和延遲加載(此處討論只考慮延遲加載的情況,因爲使用延遲加載有時候單例bean的加載順序會影響創建成功與否)
    bean採用立即加載的方式,一定可以加載成功嗎

情況羅列:

  • 當循環依賴的bean都是使用構造器注入的時候,無論兩個bean是singleton和prototype中哪種組合,獲取bean都失敗(BeanCreationException)
  • 當採用屬性注入的時候,不同組合不同表現
    • 雙方都是singleton,那麼無論先獲取哪個bean都會成功
    • 如果都是prototype,無論哪個先都會失敗
    • 如果一個s一個prototype,必須先獲得s纔可以成功
  • 當同時屬性和構造器的時候,只有 兩種成功情況
    • 兩者都是singleton,並且容器啓動後,先去獲得由屬性注入的bean
    • 一個s,一個p,其中s是屬性注入,p是構造器,容器啓動後先獲取s

總結:
如果多個bean存在循環依賴,在Spring容器啓動後,只有當獲取的第一個bean是通過屬性注入依賴的singleton時,纔會成功,別的情況都會失敗

原因
循環依賴會出現:Spring在創建A的時候,發現其引用了B,那麼就去創建B。在創建B的時候發現引用了A,再去創建A,兩者相互等待,誰都不能成功創建。
1.爲什麼一定要用屬性注入呢?
如果需要打破這個環,就必須保證至少得有一個bean可以在自身依賴沒有滿足之前就被創建(至少要被實例化,可以先不注入其依賴) ,這種bean只能通過屬性注入實現:因爲他可以先使用默認構造器創建實例,然後再通過setter注入。如果使用構造器注入方法的話,依賴沒有滿足之前,沒辦法實例化。
2.爲什麼必須得有一個是singleton?
根本原因是:Spring容器只會對singleton的bean保存引用,而不會對prototype保存引用
具體來說:
Spring容器啓動後,先獲取SingletonA,那麼容器會執行下面幾個步驟:
①嘗試創建SA,發現是S的生存域並且通過屬性注入,那麼先使用默認構造器創建一個實例,並保存對其引用,並標記爲“SA正在創建中”,發現A依賴B,去創建B
②嘗試創建B,發現是S的生存域並且通過屬性注入,那麼先使用默認構造器創建一個實例,並保存對其引用,發現依賴了A,創建A
③嘗試創建A,由於A是S生存域的,spring容器發現有一個SA被標記爲正在創建中,那麼就不會再去創建,而是直接給B返回①中保存的A的引用
④SA通過屬性注入B,B創建完成
⑤SB通過屬性注入A,A完成
如果第一個獲取的是prototype域的話,不會保存對第一個類對象的引用,那麼無法打破循環
3.爲什麼第一個獲取的必須是Singleton
這個和Spring的具體實現有關,當Spring容器遍歷那些循環依賴的bean時,只要遍歷到那種已經遍歷過一次的bean,並且它們不是通過屬性注入依賴的singleton時,就會直接拋出BeanCurrentlyInCreationException異常

Spring中Bean的作用域

Spring中Bean的作用域、生命週期:
https://www.cnblogs.com/zhanglei93/p/6231882.html

有五種
Singleton(單例)

48. 快速失敗

Java的快速失敗和安全失敗http://www.cnblogs.com/ygj0930/p/6543350.html

49. 線程池流程,原理

JAVA線程池原理詳解一https://www.cnblogs.com/dongguacai/p/6030187.html

  1. volatile鎖

51. callable和哪個類一起用可以知道結果

JAVA併發編程-返回執行結果(Callable和Future)(九):https://blog.csdn.net/hejingyuan6/article/details/47065629

發佈了61 篇原創文章 · 獲贊 287 · 訪問量 64萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章