Java面試問題整理

今天畢業了,準備整理整理面試題。

Mybatis中mapper層和dao如何進行映射?

Mybatis將配置文件中的每一個< mapper>節點抽象成一個Mapper

HTTP狀態碼和HTTP狀態碼分類

狀態碼

狀態碼 含義
200 請求成功
301 資源被永久轉義到其他URL
404 請求的資源不存在
500 內部服務器錯誤

狀態碼分類

分類 分類含義
1** 信息,服務器收到請求,需要請求者繼續執行操作
2** 成功,操作被成功接收並處理
3** 重定向,需要進一步的操作以完成請求
4** 客戶端錯誤,請求包含語法錯誤或無法完成請求
5** 服務器錯誤,服務器在處理請求的過程中發生了錯誤

Spring中bean的生命週期

Spring中的bean的聲明週期有5種:singleton(單例)、prototype(多例)、request、session、globalsession。
在這裏插入圖片描述
在Spring中,那些組成程序的主體和由Spring IoC管理的對象稱爲bean。簡單地講,bean就是由IoC容器初始化、裝配及管理的對象。
Spring中的bean默認是單例模式。對於Web應用來說,Web容器對於每個用戶請求都創建一個單獨的Sevlet線程來處理請求。Spring的單例是基於BeanFactory也就是Spring容器的,單例Bean在此容器內只有一個。
當一個bean的作用域爲Singleton,那麼Spring IoC容器中只會存在一個共享的bean實例,並且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一實例。Singleton是單例類型,就是在創建起容器時就同時自動創建了一個bean的對象,不管你是否使用,他都存在了,每次獲取到的對象都是同一個對象。(但我們可以指定Bean節點的lazy-init=”true”來延遲初始化bean,這時候,只有在第一次獲取bean時纔會初始化bean,即第一次請求該bean時才初始化)

網絡上有很多資源,我就沒有抄下來,按自己想法先寫。

這裏借鑑的博客有
https://blog.csdn.net/u012385190/article/details/81368748#二、BeanFactory的bean生命週期相關代碼

  <bean id="person" class="demo02.bean.Person"
          p:address="上海市"
          p:age="25"
          init-method="myInit"
          destroy-method="myDestroy"
  />

按照上面的說法:
第一步:實例化創建bean
第二步:按照Spring上下文對實例化的Bean進行配置
第三步:實現BeanNameAware接口,調用setBeanName(String beanId)方法,傳遞的是Spring配置文件中bean的ID
第四步:實現BeanFactoryAware接口,調用它實現的setBeanFactory(),傳遞Spring工廠本身。
從這一步開始,到後面就不懂了

第n步:使用
最後一步:銷燬

Mybatis的緩存

Mybatis的緩存分爲一級緩存和二級緩存。
每當我們使用MyBatis開啓一次和數據庫的會話,MyBatis會創建出一個SqlSession對象表示一次數據庫會話。
如下圖所示,MyBatis會在一次會話的表示----一個SqlSession對象中創建一個本地緩存(local cache),對於每一次查詢,都會嘗試根據查詢的條件去本地緩存中查找是否在緩存中,如果在緩存中,就直接從緩存中取出,然後返回給用戶;否則,從數據庫讀取數據,將查詢結果存入緩存並返回給用戶。
在這裏插入圖片描述
SqlSession對象裏面有Executor對象操作緩存,使用HashMap存儲緩存。不同的sqlSession之間的緩存數據區域(HashMap)是互相不影響的。

二級緩存
二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。
二級緩存要手動開啓

Java集合類框架的基本接口有哪些?

總共有兩大類接口:Collection和Map,一個是元素集合,一個是鍵值對集合;其中List和Set接口繼承了Collection接口,List是有序集合,Set是無序集合;ArrayList和LinkedList實現了List接口;HashSet實現了Set接口,但是實際上是基於HashMap實現的;HashMap和HashTable實現了Map接口,並且HashTable是線程安全的,由此HashMap性能更好。

HashMap工作的原理

Java中HashMap使用HashCode( )和equal( )方法來確定鍵值對的索引,當根據鍵獲取值的時候也會用到這兩個方法。在jdk1.8以前,實現方式是:數組+鏈表,jdk1.8會後添加了紅黑色也就變成了:數組+鏈表+紅黑樹。當鏈表長度大於8時,自動轉換爲紅黑樹。

如果key爲自定義的類,要使用HashMap必須重寫Object裏的hashCode( )和equal( )方法。當兩個hashCode相同時,類不一定相等。如果兩個equal相等,那hashCode也相等。

HashMap和HashTable有什麼區別

兩則都實現了Map接口。
HashMap允許簡直都是null,HashTable不允許簡直爲null。
HashTable是線程安全的,性能差。
HashMap非線程安全,性能好。

數組(Array)和鏈表(ArrayList)區別

數組大小固定,鏈表大小可動態變化。
數組是順序存儲,鏈表通過指針存儲,存儲地址非連續的。
鏈表插入刪除快,查詢慢。數組相反。
數組只能包含基本類型和對象類型,ArrayList只能包含對象類型。

異常處理完用戶,Exception對象會發生什麼變化?

異常處理對象在異常處理完後,沒有引用指向他,變成不可達對象。JVM在gc過程中進行標記,如果實現了finalize方法,會被安排到F-queue所在線程中,在下一次執行gc中,Exception如果要將執行完finalize方法,就會被回收。

finally代碼塊和finalize( )方法有什麼區別?

無論是否發生異常,finally代碼一定會執行,如果catch和finally中都有return,那麼finally就會覆蓋catch的return。finalize()方法是Object類的一個protected方法,它是在對象被垃圾回收之前由Java來調用。

數據庫連接池

定義數據庫連接池會設定這兩個值:最大連接數、最小連接數。連接對象可分爲可使用和在使用,當請求一個連接對象時,先去可使用請求,如果連接數未達到上限,直接分配,如果沒有可使用對象,但是連接數未達到最大,直接去在使用那邊創建一個連接使用,否則等待。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章