JAVA面試——常見問題
- Java關鍵字
- transient
- Java的serialization持久化對象實例時,用來表示一個域不是對象串行化的一部分
- native
- volatile
- 表示能夠被多個線程異步修改的成員變量
- 確保全部線程看到的指定變量值相同
- 禁止指令重排序
- 實現機制:
- lock前綴指令,造成內存屏障,以前操做必須所有完成
- 對緩存的修改當即寫入主存
- 寫操做後,其餘CPU中的緩存無效
- Java多線程
- Lock與synchronized區別:
- Lock是一個接口,synchronized是java關鍵字
- synchronized發生異常時會自動釋放線程佔有的鎖,Lock須要手動釋放
- Lock能夠響應中斷
- 提升讀操做的效率
- 序列化與反序列化:
- 序列化:對象轉換爲字節序列
- 序列化用途:對象持久化,保存在磁盤;網絡傳輸對象
- Java NIO:
- Channel(通道)
- IO中的Steam是單向的,Channel雙向,可進行讀寫
- Buffer(緩衝區)
- Selector(選擇器)
- 輪詢每一個註冊的通道,有註冊事件發生,進行處理
- 同步非阻塞IO,對IO的讀寫是同步阻塞的,經過線程複用,將IO準備事件分離
- 單線程管理多個通道,沒必要建立並維護多個線程,減小線程上下文切換致使的開銷
- SelectorKey表示一個到達的事件
- 同步&非同步、阻塞&非阻塞
- 同步:對象是多個進程或多個線程,可否併發執行,能則兩個線程是同步的
- 阻塞:單進程或線程,等待(阻塞)仍是返回標誌信息(非阻塞)
- 同步IO&異步IO:
- 同步IO:IO操做完成以前,線程阻塞
- 異步IO:IO操做不會致使請求線程阻塞,IO操做兩個階段都是由內核完成,不會阻塞用戶線程
- IO:1)查看是否就緒 2)數據拷貝
- 區別:數據拷貝是由用戶仍是內核完成
- 阻塞IO是反映在IO操做的第一個階段(查看是否就緒)
- JAVA設計模式:
- 代理模式:
- 爲其餘對象提供代理,控制對此對象的訪問(Thread實現Runnable接口)
- 策略模式:
- 單例模式:
- 系統中只有一個實例,用在資源共享
- 數據庫鏈接池、線程池
- 構造函數設置爲private,定義static變量儲存實例
- 裝飾模式:
- 在不改變原類和使用繼承的狀況下,動態擴展一個對象的功能。
- 經過建立一個包裝對象,包裹真實對象
- 工廠模式:
- 原型模式
- 模板方法模式
- 內存泄露:
- 無用對象持續佔有內存空間而得不到釋放
- 緣由:長生命週期對象持有短生命週期對象
- Servlet、Tomcat、Spring MVC關係
- Servlet:小型JAV程序,運行在Web服務器中處理用戶請求
- Tomcat:做爲Web應用服務器,是一個Servlet容器,對Servlet進行管理
- 一個基本的流程:
- tomcat接收請求,找到合適的Servlet來處理請求,若是該Servlet沒加載,就順便編譯加載到JVM,若是加載了,就調init方法初始化,調Service方法處理request並返回responser,觀測Servlet狀態變化,在結束時調用destory方法
- Spring MVC:Spring 提供的一個MVC框架,把保存數據Map的Model、頁面顯示的View、控制器Controller三者分析,簡化web項目開發難度
- Spring Boot 將Tomcat設爲默認容器,Spring MVC的入口是一個Servlet(前置控制器DispatcherServlet),前置控制器攔截請求,分發給Controller處理
- String StringBuffer StringBuilder
- String用final修飾, 不可變
- 都用字符數組保存字符串char[] value
- StringBuffer加同步鎖,線程安全;StringBuilder沒加
- 接口與抽象類區別
- 一個類能夠實現多個接口,可是隻能實現一個抽象類
- 接口中的實例變量是final類型的
- 一個類須要實現接口中的全部方法,抽象類不必定
- 接口中的方法不能實現,抽象類能夠有非抽象的方法
- 接口不能經過new實例化,但能夠聲明
- Servlet
- 負責接收用戶HttpServletRequest,並將HttpServletResponse反饋給用戶
- 不是線程安全的
歡迎關注本站公眾號,獲取更多信息