Java開發工程師面試基礎

知識點

  • 1.java基礎
  • 2.數據結構和八大算法
  • 3.多線程基礎
  • 4.spring,spring MVC,mybatis基礎。
  • 5.jvm基礎。
  • 6.gc基礎。

Java基礎

  • 【面向對象優點】
  • 1.開發模塊化,更易維護和修改。
  • 2.代碼複用。
  • 3.增加代碼可靠性,靈活性和可理解性。

【多態】
- 同一個事件發生在不同的對象上會產生不同的結果。
- 多態是編程語言給不同的底層數據類型做相同的接口展示的一種能力

【繼承】
- 1.提供代碼的重用性。

【抽象】【封裝】
- 1.【抽象】和【封裝】是互補。
- 2.【抽象】關注對象的行爲。
- 3.【封裝】關注對象的行爲的細節。
- 4.【封裝】提供抽象的一種策略。

【接口】【抽象類】
- 1.【接口】方法隱含的都是抽象,抽象類可以包含非抽象
- 2.可以實現多個接口,但只能繼承一個抽象類。
- 3.【接口】final,【抽象】非final

- 4.【接口】public,【抽象】非public

【Java虛擬機】
- 一個可以執行Java字節碼的虛擬機進程,java可以在任意一個有JVM的平臺都可以運行。

  • 【static】【override】
  • 【static】編譯時靜態綁定的。
  • 【override】運行時動態綁定的。

-【overriding覆蓋】【overloading重載】
-【overrding】是子類重新定義父類的方法。

-【overloading】多個相同方法名參數不一致

【java數據類】

- byte,int,short,long,float,double,char,boolean

【值傳遞】
- 對基本型變量而言的,傳遞的是該變量的一個副本,改變副本不影響原變量
- 【引用傳遞】
- 對象型變量,變量地址的副本,會影響變量值。

【創建線程的三種方式】
- 1.繼承Thread類。
- 2.實現runnable接口。

- 3.使用Executor框架來創建線程池

【Java集合類框架的基本接口】
- 1.Collection:代表一組對象,每一個對象都是它的子元素。
- 2.Set:不包含重複元素的Collection
- 3.List:有順序的collection,並且可以包含重複元素。
- 4.Map:可以把鍵(key)映射到值(value)的對象,鍵不能重複。

  • 【數組(Array)】和【列表(ArrayList)】
  • 【Array】包含基本類型,對象類型。【ArrayList】包含對象類型
  • 【Array】大小固定 【ArrayList】動態變化

  • 【ArrayList】

  • 基於索引,o(1)
  • 【LinkedList】
  • 元素列表,o(n)

gc面試題

-GC是在什麼時候,對什麼東西,做了什麼事情?
- GC什麼時候開始回收
- eden滿了minor gc,升到老年代的對象大於老年代剩餘空間full gc,或者小於時被HandlePromotionFailure參數強制full gc;gc與非gc時間耗時超過了GCTimeRatio的限制引發OOM,調優諸如通過NewRatio控制新生代老年代比例,通過MaxTenuringThreshold控制進入老年前生存次數等
- 對什麼東西:
- 1.超出作用域或者是引用基數爲0的對象
- 2.從gc root開始搜索,搜索不到的對象
- 3.從root搜索不到,而且經過第一次標記、清理後,仍然沒有復活的對象
- 做什麼事情:
- 刪除不使用的對象,騰出內存空間
- 新生代做的是複製清理,老年代做的標記處理,

JVM

  • JVM內存分哪幾個區,每個區的作用是什麼?
  • 【方法區】
  • 線程共享,存儲已被虛擬機加載的類的信息、常量、靜態變量和即時編譯器編譯後的代碼等數據,
  • 【虛擬機棧】
  • 棧內存,爲Java方法服務,線程私有。
  • 【本地方法棧】
  • 與虛擬機棧類型類型,爲native服務
  • 【堆】
  • 線程共享的內存,經常發生GC
  • 【程序計數器】
  • 內存空間小,字節碼解釋器工作時通過改變這個計數值可以選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理和線程恢復等功能都需要依賴這個計數器完成。該內存區域是唯一一個java虛擬機規範沒有規定任何OOM情況的區域。

  • 判斷對象是否存在?

  • 1.引用計數法
  • 會存在循環引用的問題,主流虛擬機都不採用這種算法。
  • 2.可達性算法
  • 從GC ROOTS對象向下搜索,如果一個對象到GCRoots沒有任何引用鏈相連。則說明此對象不可用。
  • 可用GCRoots對象有:虛擬機棧中引用的對象,方法區類靜態屬性引用的對象,方法區常量池引用的對象,本地方法棧JNI引用的對象。
  • 不一定會被回收,不一定會馬上回收,而是處於一個死緩的階段,需要經過兩次標記。

  • 簡訴下java垃圾回收機制

  • 虛擬機自動運行,低優先級的垃圾回收線程,在空閒或者內存不足時執行,掃描無引用對象,添加到回收集合,進行回收。

  • java中垃圾收集方法
    【標記-清除】

  • 標記回收對象,統一回收。
  • 效率低,產生不連續內存碎片,容易導致以後沒有足夠大的內存而提前觸發GC
    【複製算法】
  • ,複製算法將可用內存按容量劃分爲相等的兩部分,然後每次只使用其中的一塊,當一塊內存用完時,就將還存活的對象複製到第二塊內存上,然後一次性清楚完第一塊內存,再將第二塊上的對象複製到第一塊。但是這種方式,內存的代價太高,每次基本上都要浪費一半的內存。
  • 優化:分爲8:1:1,eden和survivor,survivor(分別叫from和to)
  • 參考鏈接
    【標記-整理】
  • 每次將可回收對象移動到一端,清除邊界以外的對象、不會產生內存碎片。
    【分代收集】
  • 分爲年輕代和老年代。
  • 年輕代由於生存期短,更新換代快,採用複製算法。
  • 老年代使用標記清除或者標記整理

【java內存模型】
-java內存模型(JMM)是線程間通信的控制機制.JMM定義了主內存和線程之間抽象關係。線程之間的共享變量存儲在主內存(main memory)中,每個線程都有一個私有的本地內存(local memory),本地內存中存儲了該線程以讀/寫共享變量的副本。本地內存是JMM的一個抽象概念,並不真實存在。它涵蓋了緩存,寫緩衝區,寄存器以及其他的硬件和編譯器優化。Java內存模型的抽象示意圖如下:

【java類加載過程?】
- 加載-》驗證-》準備-》解析-》初始化
- 【java類加載機制】
- 虛擬機把描述類的數據從Class文件加載到內存,並對數據進行校驗,解析和初始化,最終形成可以被虛擬機直接使用的java類型

【類加載器雙親委派模型機制】
- 當一個類收到了類加載請求時,不會自己先去加載這個類,而是將其委派給父類,由父類去加載,如果此時父類不能加載,反饋給子類,由子類去完成類的加載。

【簡述java內存分配與回收策率以及Minor GC和Major GC】
- 1.對象優先在堆的Eden區分配。
- 2.大對象直接進入老年代.
- 3.長期存活的對象將直接進入老年代.
當Eden區沒有足夠的空間進行分配時,虛擬機會執行一次Minor GC.Minor Gc通常發生在新生代的Eden區,在這個區的對象生存期短,往往發生Gc的頻率較高,回收速度比較快;Full Gc/Major GC發生在老年代,一般情況下,觸發老年代GC的時候不會觸發Minor GC,但是通過配置,可以在Full GC之前進行一次Minor GC這樣可以加快老年代的回收速度。
參考鏈接

spring

【控制反轉IOC】
- Spring 把相互協作的關係稱爲依賴關係。假如 A 組件調用了 B 組件的方法,我們可稱A 組件依賴於 B 組件。
- 在依賴注入的模式下,創建被調用者的工作不再由調用者來完成,因此稱爲控制反轉
- 好處:依賴注入讓 Spring 的 Bean以被指文件組織在一起,而不是以硬編碼的方式耦合在一起。程序完成無須理會被調用者的實現,也不無須主動定位工廠,這是最好的解耦方式。實例之間的依賴關係由 IoC 容器負責管理

【依賴注入】
- IoC的一個重點是在系統運行中,動態的向某個對象提供它所需要的其他對象。這一點是通過DI(Dependency Injection,依賴注入)來實現的

【Java注入三種方式】
- 1.構造注入
- 2.Setter注入
- 3.接口注入

【spring中的bean】
- Java的實例,Java組件,包括任何應用
- 參考鏈接

【Spring的三種配置方式】
- 1.基於xml的配置
- 2.基於註解的配置
- 3.基於Java的配置

【spring bean的作用域】
- singleton 默認範圍 只有唯一一個實例
- prototype 爲每一個bean提供一個實例
- request 在請求bean範圍內會每一個來自客戶端的網絡請求創建一個實例,在請求完成以後,bean會失效並被垃圾回收器回收。
- session 確保每個session中有一個bean的實例,在session過期後,bean會隨之失效。
- global-session global-session和Portlet應用相關。當你的應用部署在Portlet容器中工作時,它包含很多portlet。如果你想要聲明讓所有的portlet共用全局的存儲變量的話,那麼這全局變量需要存儲在global-session中。

【Spring框架中的單例Beans是線程安全的麼?】
- Spring框架並沒有對單例bean進行任何多線程的封裝處理,如果這個bean有多種變化的話,就需要自行保證線程安全【PS:最淺顯的解決方案:改變作用域爲prototype】

【Spring框架中有哪些不同類型的事件】
- 1.上下文更新事件(ContextRefreshedEvent)
- 2.上下文開始事件(ContextStartedEvent)
- 3.上下文停止事件(ContextStoppedEvent)
- 4.上下文關閉事件(ContextClosedEvent)
- 5.請求處理事件(RequestHandledEvent)

【Spring 框架中都用到了哪些設計模式?】
- 【代理模式】
- AOP remoting
- 【單例模式】
- spring配置文件中定義的bean默認爲單例模式
- 【模板方法】
- 用來解決代碼重複的問題。比如. RestTemplate, JmsTemplate, JpaTemplate
- 【前端控制器】
- Spring提供了DispatcherServlet來對請求進行分發
- 【視圖幫助】
- Spring提供了一系列的JSP標籤,高效宏來輔助將分散的代碼整合在視圖裏。
- 【依賴注入】
- 貫穿於BeanFactory / ApplicationContext接口的核心理念
- 【工廠模式】
- BeanFactory用來創建對象的實例

spring MVC

  • 【特點】
  • 1.基於組件技術【控制器,視圖和業務對象】
  • 2.不依賴於servlet API
  • 3.可以使用各種視圖技術
  • 4.支持各種請求資源的策略
  • 5.易於擴展

  • 【SpringMVC的工作流程】

    1. 用戶發送請求至前端控制器DispatcherServlet
    1. DispatcherServlet收到請求調用HandlerMapping處理器映射器。
    1. 處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。
    1. DispatcherServlet通過HandlerAdapter處理器適配器調用處理器
    1. 執行處理器(Controller,也叫後端控制器)。
    1. Controller執行完成返回ModelAndView
    1. HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
    1. DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
    1. ViewReslover解析後返回具體View
    1. DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)。
    1. DispatcherServlet響應用戶
  • 【strust2和springMVC的區別】

  • 1.【springMVC】入口是servlet,【strust2】入口是filter
    1. 【springMVC】是基於方法開發(一個url對應一個方法),請求參數傳遞到方法的形參,可以設計爲單例或多例。【strust2】基於類開發,傳遞參數是通過類的屬性,只能設計爲多例。
  • 3.Struts採用值棧存儲請求和響應的數據,通過OGNL存取數據,springmvc通過參數解析器是將request請求內容解析,並給方法形參賦值,將數據和視圖封裝成ModelAndView對象,最後又將ModelAndView中的模型數據通過reques域傳輸到頁面。Jsp視圖解析器默認使用jstl。

  • 【SSM優缺點】

    1. Mybatis和hibernate不同,它不完全是一個ORM框架,因爲MyBatis需要程序員自己編寫Sql語句,不過mybatis可以通過XML或註解方式靈活配置要運行的sql語句,並將java對象和sql語句映射生成最終執行的sql,最後將sql執行的結果再映射生成java對象。
    1. Mybatis學習門檻低,簡單易學,程序員直接編寫原生態sql,可嚴格控制sql執行性能,靈活度高,非常適合對關係數據模型要求不高的軟件開發,例如互聯網軟件、企業運營類軟件等,因爲這類軟件需求變化頻繁,一但需求變化要求成果輸出迅速。但是靈活的前提是mybatis無法做到數據庫無關性,如果需要實現支持多種數據庫的軟件則需要自定義多套sql映射文件,工作量大。
    1. Hibernate對象/關係映射能力強,數據庫無關性好,對於關係模型要求高的軟件(例如需求固定的定製化軟件)如果用hibernate開發可以節省很多代碼,提高效率。但是Hibernate的學習門檻高,要精通門檻更高,而且怎麼設計O/R映射,在性能和對象模型之間如何權衡,以及怎樣用好Hibernate需要具有很強的經驗和能力才行。
  • 【Mybatis】

    1. mybatis配置
    1. SqlMapConfig.xml,此文件作爲mybatis的全局配置文件,配置了mybatis的運行環境等信息。
    1. mapper.xml文件即sql映射文件,文件中配置了操作數據庫的sql語句。此文件需要在SqlMapConfig.xml中加載。
    1. 通過mybatis環境等配置信息構造SqlSessionFactory即會話工廠
    1. 由會話工廠創建sqlSession即會話,操作數據庫需要通過sqlSession進行。
    1. mybatis底層自定義了Executor執行器接口操作數據庫,Executor接口有兩個實現,一個是基本執行器、一個是緩存執行器。
    1. Mapped Statement也是mybatis一個底層封裝對象,它包裝了mybatis配置信息及sql映射信息等。mapper.xml文件中一個sql對應一個Mapped Statement對象,sql的id即是Mapped statement的id。
    1. Mapped Statement對sql執行輸入參數進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql前將輸入的java對象映射至sql中,輸入參數映射就是jdbc編程中對preparedStatement設置參數。
    1. Mapped Statement對sql執行輸出結果進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql後將輸出結果映射至java對象中,輸出結果映射過程相當於jdbc編程中對結果的解析處理過程。

    多線程基礎

    【進程】

  • 獨立的運行環境,一個程序或應用。Java運行環境是一個包含了不同的類和程序的單一進程。
    【線程】
  • 進程的一個任務或輕量級的線程,少資源,共享進程的資源。
    【多線程的優點】
  • 1.提交程序的運行效率。
  • 2.不會因爲某個線程而等待資源。
  • 3.servlets比CGI好,CGI不支持多線程。

【用戶線程】
- Java程序中創建一個線程,它就被稱爲用戶線程
- 沒有用戶線程,JVM關閉程序且退出。
【守護線程】
- 一個守護線程是在後臺執行並且不會阻止JVM終止的線程
- 子線程仍是守護線程

【線程生命週期】
- Runnable,Waiting,Blocked,Dead

【線程的優先級】
- 線程優先級是一個int變量(從1-10),1代表最低優先級,10代表最高優先級

【線程的join方法】
- 釋放所有線程資源來執行當前調用這個方法的線程直到結束。

【線程之間的通信】
- Object類中wait()\notify()\notifyAll()方法可以用於線程間通信關於資源的鎖的狀態

【確保線程安全】
- 1.使用原子類(atomic concurrent classes)
- 2.實現併發鎖
- 3.使用volatile關鍵字
- 4.使用不變類和線程安全類

【死鎖】
- 兩個以上的線程永遠阻塞的情況,這種情況產生至少需要兩個以上的線程和兩個以上的資源。

【數據結構和八大算法】
- 內部排序
- - 插入排序
- - - 直接插入排序
- - - 希爾排序
- - 選擇排序
- - - 簡單選擇排序
- - - 堆排序
- - 交換排序
- - - 冒泡排序
- - - 快速排序
- - 歸併排序
- - 基數排序
- 外部排序
- 八大排序算法參考鏈接

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