Java面試題匯總---整理版(附答案)


今天繼續為大家整理Java面試題,並涉及數據庫和網絡等相關知識,希望能幫助到各位開發者。

1,為什么要用spring,Spring主要使用了什么模式?

spring能夠很好的和各大框架整合,它通過IOC容器管理了對象的創建和銷毀  工廠模式。在使用hiberna,mybatis的時候,不用每次都編寫提交的事務的代碼,可以使用spring的AOP來管理事務。AOP其實就是一個動態代理的實現(聲明式事務和編程式事務)。

主要使用了模式:

工廠模式:每個Bean的創建通過方法;

單例模式:默認的每個Bean的作用域都是單例;

代理模式:關於Aop的實現通過代理模式;

2、Mybatis工作原理?

 

原理:

  • 通過SqlSessionFactoryBuilder從mybatis-config.xml配置文件中構建出SqlSessionFactory。

  • SqlSessionFactory開啟一個SqlSession,通過SqlSession實例獲得Mapper對象並且運行Mapper映射的Sql語句。

  • 完成數據庫的CRUD操作和事務提交,關閉SqlSession。

3,mybatis的優缺點?

優點:SQL寫在XML中,便於統一管理和優化

           提供映射標簽,支持對象和數據庫的orm字段關系映射

           可以對SQL進行優化

缺點: SQL工作量大

            mybagtis移植姓不好

            不支持級聯 

4,maven是什么?有什么作用?

是一個項目管理、構建工具

作用:幫助下載jar   尋找依賴,幫助下載依賴   熱部署、熱編譯。

5,什么RESTful架構?

1)每一個URI代表一種資源;

2)客戶端和服務器之間,傳遞這種資源的某種表現層;

3)客戶端通過四個HTTP動詞,對服務器端資源進行操作,實現"表現層狀態轉化",

6,說說tcp/ip協議族

TCP/IP協議族是一個四層協議系統,自底而上分別是數據鏈路層、網絡層、傳輸層和應用層。每一層完成不同的功能,且通過若干協議來實現,上層協議使用下層協議提供的服務。

1)數據鏈路層負責幀數據的傳遞。

2)網絡層責數據怎樣傳遞過去。

3)傳輸層負責傳輸數據的控制(准確性、安全性)

4)應用層負責數據的展示和獲取

7,說說tcp三次握手,四次揮手。

 

TCP的連接建立是一個三次握手過程,目的是為了通信雙方確認開始序號,以便后續通信的有序進行。主要步驟如下:

1)連接開始時,連接建立方發送SYN包,並包含了自己的初始序號a;

2)連接接受方收到SYN包后會回復一個SYN包,其中包含對上一個a包的回應信息ACK,回應的序號為下一個希望收到包的序號,即a+1,然后還包了自己的初始序號b;

3. 連接建立方(Client)收到回應的SYN包以后,回復一個ACK包做響應,其中包含了下一個希望收到包的序號即b+1。

TCP終止連接的四次握手過程如下:

1. 首先進行關閉的一方(即發送第一個FIN)將執行主動關閉,而另一方(收到這個FIN)執行被動關閉。

2. 當服務器收到這個FIN,它發回一個ACK,確認序號為收到的序號加1。和SYN一樣,一個FIN將占用一個序號。

3. 同時TCP服務器還向應用程序(即丟棄服務器)傳送一個文件結束符。接着這個服務器程序就關閉它的連接,導致它的TCP端發送一個FIN。

4. 客戶必須發回一個確認,並將確認序號設置為收到序號加1。

8,GIT和SVN的區別

主要區別如下:

1)GIT是分布式的,SVN不是。

2)GIT把內容按元數據方式存儲,而SVN是按文件。

3)GIT分支和SVN的分支不同。

4)GIT沒有一個全局的版本號,而SVN有。

5)GIT的內容完整性要優於SVN。

9,BIO、NIO和AIO的區別

Java BIO : 同步並阻塞,服務器實現模式為一個連接一個線程,即客戶端有連接請求時服務器端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。

Java NIO : 同步非阻塞,服務器實現模式為一個請求一個線程,即客戶端發送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理。

Java AIO: 異步非阻塞,服務器實現模式為一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啟動線程進行處理。

NIO比BIO的改善之處是把一些無效的連接擋在了啟動線程之前,減少了這部分資源的浪費(因為我們都知道每創建一個線程,就要為這個線程分配一定的內存空間)。

AIO比NIO的進一步改善之處是將一些暫時可能無效的請求擋在了啟動線程之前,比如在NIO的處理方式中,當一個請求來的話,開啟線程進行處理,但這個請求所需要的資源還沒有就緒,此時必須等待后端的應用資源,這時線程就被阻塞了。

10,為什么要用線程池?

線程池是指在初始化一個多線程應用程序過程中創建一個線程集合,然后在需要執行新的任務時重用這些線程而不是新建一個線程。

使用線程池的好處:

1、線程池改進了一個應用程序的響應時間。由於線程池中的線程已經准備好且等待被分配任務,應用程序可以直接拿來使用而不用新建一個線程。

2、線程池節省了CLR 為每個短生存周期任務創建一個完整的線程的開銷並可以在任務完成后回收資源。

3、線程池根據當前在系統中運行的進程來優化線程時間片。

4、線程池允許我們開啟多個任務而不用為每個線程設置屬性。

5、線程池允許我們為正在執行的任務的程序參數傳遞一個包含狀態信息的對象引用。

6、線程池可以用來解決處理一個特定請求最大線程數量限制問題。

11,悲觀鎖和樂觀鎖的區別,怎么實現?

悲觀鎖:一段執行邏輯加上悲觀鎖,不同線程同時執行時,只能有一個線程執行,其他的線程在入口處等待,直到鎖被釋放。

樂觀鎖:一段執行邏輯加上樂觀鎖,不同線程同時執行時,可以同時進入執行,在最后更新數據的時候要檢查這些數據是否被其他線程修改了(版本和執行初是否相同),沒有修改則進行更新,否則放棄本次操作。

悲觀鎖的實現:

樂觀鎖的實現:

12,java中的堆和棧分別是什么數據結構,為什么要分為堆和棧來存儲數據?

棧是一種具有后進先出性質的數據結構,也就是說后存放的先取,先存放的后取。堆是一種經過排序的樹形數據結構,每個結點都有一個值。通常我們所說的堆的數據結構,是指二叉堆。堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。由於堆的這個特性,常用來實現優先隊列,堆的存取是隨意的。

為什么要划分堆和棧:

1)從軟件設計的角度看,棧代表了處理邏輯,而堆代表了數據。這樣分開,使得處理邏輯更為清晰。

2)堆與棧的分離,使得堆中的內容可以被多個棧共享。一方面這種共享提供了一種有效的數據交互方式(如:共享內存),另一方面,堆中的共享常量和緩存可以被所有棧訪問,節省了空間。

3)棧因為運行時的需要,比如保存系統運行的上下文,需要進行地址段的划分。由於棧只能向上增長,因此就會限制住棧存儲內容的能力。而堆不同,堆中的對象是可以根據需要動態增長的,因此棧和堆的拆分,使得動態增長成為可能,相應棧中只需記錄堆中的一個地址即可。

4)體現了Java面向對象這一核心特點(也可以繼續說一些自己的理解)。

如果你想學習或了解更多,請關注此公眾號,在公眾號聯系或私聊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM