答案經過網路整理,難免有重覆的內容,感謝各位博主的無私奉獻 1. TCP和UDP的區別,哪個是三次握手? TCP(Transmission Control Protocol 傳輸控制協議) UDP(User Datagram Protocol 用戶數據包協議) OSI(Open Syst ...
--答案經過網路整理,難免有重覆的內容,感謝各位博主的無私奉獻
1. TCP和UDP的區別,哪個是三次握手?
TCP(Transmission Control Protocol 傳輸控制協議)
UDP(User Datagram Protocol 用戶數據包協議)
OSI(Open System Interconnection 開放系統互聯)七層參考模型:應用層(表現層,會話層),傳輸層,網路層,數據鏈路層,物理層
二者都是OSI(Open System Interconnection 開放系統互聯)參考模型中傳輸層的 協議,其中TCP是三次握手的協議。
二者區別如下:
1)TCP是面向連接的(即建立通信之前需要通過三次握手建立連接);UDP是無連接的(即不負責確認通信對象是否存在)
2)TCP通過一系列的機制提供可靠的服務,保證通過TCP傳輸的數據無差錯,不丟失,不重覆,且按序到達;而UDP則只盡最大努力交付數據,不保證可靠性,可能丟包
3)TCP面向位元組流,把數據看做一連串無結構的位元組流;UDP是面向報文的,應用程式發送多長的報文,UDP就傳輸多長
4)TCP有擁塞控制機制(流量控制),防止向網路中註入過多的數據,使網路中的路由器和鏈路不至於過載,保證接收方能夠來得及接收數據,而UDP則沒有
5)TCP連接只能是一對一的;UDP支持一對一,一對多,多對一和多對的通信
6)TCP要求的系統資源較多,UDP較少
7)TCP首部開銷20位元組;UDP的首部開銷小,只有8個位元組
8)應用場景不同,當應用程式要求通訊質量要好,數據要準確無誤是,應當使用TCP協議進行傳輸,如HTTP,FTP等文件傳輸協議;當應用程式要求通訊速度儘量快,但是對網路質量沒有太高要求時,可以使用UDP進行傳輸,如QQ語音,QQ視頻,QQ消息等
2. JDBC操作資料庫的步驟。
A.載入資料庫驅動
B.建立到資料庫的連接
C.定義sql,獲取sql執行環境,設置相應的參數
D.執行sql,處理sql執行結果——DML語句返回int, DQL語句返回結果集對象 ResultSet
E.釋放資源
3. 位元組流,字元流的區別。
1)Java中位元組流
a. 所有位元組輸入流的最大抽象父類是InputStream
b. 所有位元組輸出流的最大抽象父類是OutputStream
2)Java中字元流
a. 所有字元輸入流的最大抽象父類是Reader
b. 所有字元輸出流的最大抽象父類是Writer
二者區別:
1)位元組流操作的單元為一個位元組;字元流操作的單元為兩個位元組的Unicode碼
2) 位元組流可以處理任意類型的數據;字元流只能處理文本類型的數據
3)位元組流在操作過程中沒有用到緩衝區(記憶體),直接對文件本身進行操作;字元流使用到了緩衝區
4)位元組流在寫的時候不需要close,也能輸出內容;字元流只有在close之後,或者使用flush強制刷新緩衝區之後,才能輸出內容(與緩衝區的使用有關)
5)由於字元流有緩衝區,所以字元流的一次操作效率比位元組流高
4. 線程的幾種狀態分別是什麼?
1)新建狀態(new):將一個繼承了Thread或者實現了Runnable介面的線程類,通過new的方式創建一個實例,則此線程就進入了新建狀態
2)就緒狀態(Runnable):調用線程類的start方法之後,準備了線程所需的系統資源,線程等待CPU的使用權的狀態稱為就緒狀態。
3)運行狀態(Running):就緒狀態的線程獲取到了CPU的使用權之後的狀態,即此線程run方法中的代碼開始被執行
4)阻塞狀態(Blocked):因為某種原因,線程放棄CPU的執行權,直到重新進入就緒狀態,阻塞的情況分為以下三種:
A.等待阻塞:線程執行wait方法,釋放所有資源(包括同步鎖),JVM將其放入“等待池”中,即等待隊列。只有在超出等待時間後,或者其他線程調用同一個對象的notify或者notifyAll方法時,才能重新進入就緒狀態(Runnable)
說明:等待阻塞由於需要釋放所占有的所有資源,包括對象鎖,所以必須在同步方法塊中調用相應的鎖對象的wait方法,否則拋出異常java.lang.IllegalMonitorStateException
B.同步阻塞:線程運行同步的代碼時,需要先獲取同步鎖,則JVM把此線程放入“鎖池”中,即進入同步隊列
C.其他阻塞:運行的線程執行sleep或join方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀態。當sleep狀態超時、join等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。
說明:與wait造成的阻塞不同的是,這種阻塞不會釋放所占用的資源,即不會釋放同步鎖
5)死亡狀態(Dead):
-當線程出現異常,或者run方法執行完畢,則該線程死亡
-調用一個已經死亡的線程對象的start方法,會產生java.lang.IllegaleThreadStateException異常
5. String,StringBuilder,StringBuffer的區別。
1) String是定長字元串;StringBuilder,StringBuffer是變長字元串
2) StringBuilder是線程非安全,一般用於單線程中,執行效率較StringBuffer高
StringBuffer是線程安全的,如果在多個線程中需要同步則採用此類
6. final, finally, finalize 的區別
1) final是java中的一個關鍵字,表示最終之意
-修飾類:表示此類不能被繼承
-修飾變數:表示此變數必需被初始化,且不能修改值。通常與public static連用表示常量之意
-修飾成員方法:表示此方法不能被重寫
說明:final關鍵字不能和abstract關鍵字同用
2) finally是在異常捕獲中使用到的一個關鍵字,使用在try/catch塊之後,不管最後是否出現異常,必定執行finally中的方法塊,可用於釋放一些資源,如資料庫的連接
3) finalize是java.lang.Object類的成員方法,因此java中所有的類都擁有該方法。該方法是由JVM的GC(GarbageCollector, 垃圾回收器)在判定對象已經不可能再被調用的情況下進行回收是所執行,因此可以通過重寫該方法釋放一些資源。如果在執行此方法的過程中,拋出了無法捕獲的異常,則GC終止回收此對象,但JVM忽略此異常,並不會導致JVM終止
7. 抽象類和介面有什麼區別
抽象類 | 介面 | |
類修飾關鍵字 | abstract | interface |
繼承/實現方式 | 單繼承/extends | 多實現/implements |
設計思想 | Is-a | Like-a |
成員變數 | 和普通類一樣 | 只能是全局的靜態常量 |
成員方法 | 和普通類一樣,也可以定義一個抽象方法 | 全都是抽象方法 (public abstract) |
構造方法 | 有構造方法 | 沒有構造方法 |
對子類的影響 | 新增方法不一定影響子類 | 新增方法一定影響子類 |
註:在jdk1.8中,可以通過default關鍵字在介面實現預設的方法
8. Statement和PreparedStatement有什麼區別?哪個性能更好?
二者區別主要體現在執行效率和安全方面(sql註入問題)
-Statement:每執行一條sql語句就需要生成一條執行計劃,不適合批量處理,效率較低
-PreparedStatement:支持帶參的sql語句,在執行之前會進行預編譯並緩存下來,下次執行相同的sql語句的時候只需要傳入相應的參數即可,不需要重新編譯,適合批量處理相同的sql語句。
同時避免了用字元串拼接sql語句的sql註入問題,更安全
9. equals與==的區別
==:比較的是存放在棧中對象的堆地址,比較兩個變數中存儲的對象地址是否相同, 即是否是同一個對象
1)比較操作符兩端是否是同一對象
2)兩邊的操作數必須是同一類型才能編譯通過
3)比較的是地址,如果是基本數據類型,則比較值
equals:用來比較兩個對象的內容是否相等,是java.lang.Object類的成員方法,由 於所有的類都繼承自Object,所以該方法適用於所有對象,但是如果沒有重寫的話, 則返回的是==的判斷結果
另外==的比較效率比equals高
10. hashCode和equals方法的區別與聯繫
A.區別:
1)hashCode:
- 用來返回對象的哈希碼值,用來提高哈希表的性能
- 預設返回對象的記憶體地址經過計算後的哈希碼值
2)equals:
- 用來比較兩個對象是否“相等”
- 預設比較兩個對象的記憶體地址
B.聯繫:
二者都是用來判斷對象之間的相等關係的,根據實際業務都需要經過重寫。
為保證equals比較的是兩個對象的內容是否相同,equals方法的重寫需要滿足如下幾個原則:自反性、對稱性、傳遞性、一致性、非空性。
而hashCode則根據常規協定跟equals方法聯繫起來:
-同一對象的equals比較的內容沒有被改變的前提下,多次調用該對象的hashCode方法返回的整數值應該是一致的
-兩個對象通過調用equals方法判斷為相等,則二者返回的hashCode應該相等
-兩個對象的hashCode值相等,但是調用equals方法並不一定返回true
在設計哈希表相關的set或者map時,需要根據業務需求重寫equals方法,同時根據常規協定需要重寫hashCode方法,因為這些散列結構都是先判斷hashCode值是否相等來判斷兩個對象是否相等,若hashCode相等,再繼續比較equals方法是否相等
註意:在數據已經存儲在哈希結構中時,不能修改跟hashCode相關的信息,否則導致記憶體泄漏的隱患
11. ArrayList和LinkedList的區別。
A. ArrayList
-ArrayList內部採用動態數組的方式實現了List的數據結構
-更適合於查詢操作
B. LinkedList
-LinkedList內部採用了迴圈雙向鏈表數據結構實現List的數據結構
-更適合於增刪改操作
12. 轉發(forward)和重定向(redirect)的區別?
-轉發:
①轉發本質上是伺服器的一個行為,只有一次請求,一次響應
②瀏覽器的地址欄地址不會發生改變
③轉發過程中共用request和response對象
④轉發只在一個web應用程式中進行
-重定向:302+location
當瀏覽器第一次請求web伺服器時,web伺服器給瀏覽器返回了一個302狀態碼,和一個url地址,當瀏覽器接收到時,會立即重新對url地址發出請求,伺服器再次做出相應的過程叫重定向
①重定向本質上是瀏覽器上的一個行為,對應兩次請求,兩次響應
②瀏覽器的地址欄地址會發生改變
③重定向過程中不共用request和response對象
④重定向不僅可以定位項目內請求,還可以定位到項目外請求
13. get和post請求的區別?
- get請求的請求參數直接放在url中;post請求的請求參數放在請求體中
- get請求攜帶的數據量一般不超過4k;post請求的數據量一般不受限制
- get請求相對不安全;post請求相對安全
- get請求會連同請求參數被瀏覽器保存在歷史記錄里;post則不會
- get請求會有緩存問題;post請求則沒有
- get產生一個TCP數據包;post產生兩個TCP數據包
14. List和Map的區別
List:是存儲單列數據的集合,存儲的數據有序且可重覆
Map: 是存儲雙列數據的集合,採用鍵值對的形式進行存儲,存儲的數據是無序的,且key不能重覆,但是value值可以重覆
15. JDK中哪些實現了單例模式?
餓漢式單例模式(在JVM啟動時就需要載入的對象採用這種模式):
- Java.lang.Runtime:封裝了java的運行時環境信息,由於java是單進程的,每個JVM只對應一個Runtime實例
懶漢式單例模式(需要考慮到線程安全問題,獲取單例的方法需要同步):
- java.awt.Toolkit
- java.awt.GraphicsEnvironment
- java.awt.Desktop
16. JSP 和Servlet 有什麼關係?
JSP:Java Server Page 同Servlet一樣也是運行在伺服器端,用來產生動態html響應的。不過與Servlet不同的是,JSP以html內容為主,內嵌少量java代碼,JSP為案件的尾碼為 .jsp
當瀏覽器請求伺服器上的jsp資源時,jsp先經過轉譯,形成對應的java文件,java文件經過編譯會生成對應的class文件。Web伺服器根據class文件生成對應的servlet提供服務
17. jsp的九大內置對象。
內置對象名稱 | 類型 | 作用 |
page | Object | 代表jsp頁面本身 |
pageContext | PageContext | 封裝頁面上下文信息 |
request | HttpServletRequest | 封裝http請求信息 |
response | HttpServletResponse | 封裝http響應信息 |
session | HttpSession | 代表http會話對象 |
application | ServletContext | 封裝應用程式信息的對象 |
out | JspWriter | 用來向jsp輸出內容 |
config | ServletConfig | 用來封裝servlet配置信息的對象 |
exception | Throwable | 封裝異常信息的對象 |
18. 怎麼認為一個類是線程安全?Java有多少個關鍵字進行同步?
類是否線程安全的判斷
1) 當多個線程訪問這個類,如果需要對該類的成員方法進行寫操作,則需要考慮線程安全問題
2) 線程安全的對象在不同線程中被調用的時候,在不同的線程看來,其中的操作是以固定且一致的順序執行的。類似於資料庫操作中事務的概念。
Java中進行同步的關鍵字:
- synchronized:用來修飾成員方法或者代碼塊,實現加鎖,多線程排隊執行,重量級同步機制
- volatile:用來修飾成員變數,實現線程之間該成員變數可見,輕量級同步機制
19. JSP中的四種作用域?
pageContext, request, session, application
20. 實現會話跟蹤的技術有哪些?
(1) Cookie :基於客戶端的狀態管理技術
當瀏覽器請求伺服器上的一個服務時,伺服器會創建一個Cookie對象,然後以Set-Cookie消息頭的方式傳遞給瀏覽器。當瀏覽器再次請求伺服器上服務時,會攜帶這個Cookie對象到服務端,服務端就可以獲知上一次的數據狀態
(2) Session :基於伺服器端的狀態管理技術
當瀏覽器請求伺服器某個功能時,伺服器可以為這個瀏覽器分配一塊記憶體,並且在這個記憶體中創建一個回話對象。同時為這個會話對象分配唯一一個id號,然後將這個id號以cookie的形式傳遞給瀏覽器。瀏覽器再次請求伺服器時,會攜帶這個id到伺服器,伺服器根據id找到對應的會話對象,進行相應的服務,會話對象可以解決多個請求之間信息共用和狀態傳遞的管理
(3) Url重寫:可以解決瀏覽器禁止cookie的情形
21. 在Java中定義一個不做事且沒有參數的構造方法的作用
Java在初始化子類的時候,會用super()調用特定的父類的構造方法,若沒有,則會調用父類的無參空構造方法。若父類只定義了有參的構造,且子類又沒有調用相應的構造方法,則編譯會報錯,只能通過在父類加一個無參空構造方法,讓編譯通過。
22. jsp的常用指令有哪些?
Jsp中指令使用的語法:<%@指令名 屬性名1=”值1” 屬性名2=”值2”%>
(1) page指令:用來導包 和 做一些頁面屬性設置
① pageEncoding:用來指定頁面以何種編碼方式保存
② contentType:用來指定頁面以什麼格式和編碼進行翻譯
③ Import:用來導包
④ isErrorPage:該頁面是否是一個錯誤頁面,如果是true,則可以使用exception內置對象
⑤ errorPage:用來指定要跳轉到的錯誤頁面(在頁面報錯時)
(2) taglib指令:用來引入對應的標簽庫
① prefix:用來指定對應標簽庫的首碼或者簡稱
② uri:用來指定標簽庫的位置,或者標識
(3) include指令:用來包含對應的頁面
① file:指定包含文件的位置
23. spring中的常見註解有哪些?
(1) 組件掃描相關標註
① 創建相關組件:@Component, @Repository, @Controller, @Service
② 組件掃描相關的其他標註:@Scope(“singleton|prototype”), @PostConstruct, @PreDestroy
③ DI相關標註
1) @Value : 可以用在成員變數和set方法上,基本值直接在標註寫值,如果是複雜值,則需要用到spring的EL表達式#{}
2) @Autowired : 可以用在成員變數,set方法和構造方法上,優先使用類型進行匹配,如果類型有衝突,則啟用名字進行匹配(參數名,成員變數名)
@Qualifier(“容器中的對象名”):配合@Autowired 指定名字進行查找,但是只能用在成員變數和set方法上
3) @Resource:用在成員變數和set方法上,優先使用名字進行匹配,如果匹配不上,則使用類型進行匹配,屬於jdk中的標註
④ @Transactional屬性 : 控制事務管理
(2) Spring MVC相關標註
① @RequestMapping(“/路徑”) :匹配請求路徑(載入控制器方法上)
② @RequestParam(“name”) :指定形參要接收的參數
③ @ExceptionHandler :定義局部異常處理的方法
④ @RequestBody : 告知spring框架,返回的是一個json格式的數據
⑤ @PathVariable(“路徑變數名”) :搭建Restful應用時,指定路徑變數用
⑥ @RequestBody :把瀏覽器上傳的json數據轉換成java對象
(3) Spring AOP相關標註
① @Aspect :在標註形式aop中指明該類為切麵類
② @Before :前置通知
③ @After :最終通知
④ @AfterReturnning :後置通知
⑤ @Around :環繞通知
⑥ @AfterThrowing :異常通知
24. i++和+ +i的區別
i++:後加加,在表達式中,變數i先參與運算,再完成自增加1
++i:前加加,在表達式中,變數i先完成自增1,再參與運算
25. springmvc的運行原理
(1) DispatcherServlet作為請求的入口,客戶端所有的請求都要經過它
(2) DispatcherServlet控制器通過查詢HandlerMapping找到請求對應的Controller
(3) DispatcherServlet將請求提交到Controller,
(4) Controller調用業務邏輯處理之後,返回ModelAndView(其中封裝了數據信息和視圖信息)
(5) DispatcherServlet查詢ViewResolver根據ModelAndView找到對應的視圖展示數據
26. Servlet的生命周期
1)創建
-預設在第一次請求到來時創建
-也可以通過在web.xml配置文件中,通過
<load-on-startup>一個大於等於0的值</load-on-startup>標記,實現伺服器啟動時創建
2)初始化
-對象創建完成後,調用void init();方法完成初始化
3)不斷地提供服務
通過
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException
這三個方法不斷地向外提供服務
4)即將消亡
調用void destroy();方法
5)消亡
27. 什麼是IoC和DI?DI是如何實現的?
(1) IoC:Inversion of Control , 控制反轉,程式中需要某個對象時,由原來new方式,變成了由容器來進行創建、管理和維護組件關係。這樣做的好處是可以大大降低組件之間的耦合度
(2) DI:Dependency Injection ,依賴註入, 用以解決組件的裝配問題
(3) DI的實現方式:DI是通過反射來實現動態註入的,主要有以下幾種註入方式
① Setter註入
② 構造器註入
③ 自動化註入
28. 解釋一下什麼叫AOP(面向切麵編程)[spring中]?
AOP(Aspect Oriented Programming 面向切麵編程)是基於OOP的,可以在不修改原有代碼的情況下增加功能,通過spring的配置,可以將共通的處理代碼添加到切麵位置,實現了組件的重覆利用,將共通組件與目標對象解耦,提高了程式靈活性。
AOP相關概念;
(1) Aspect :切麵,封裝了共通的業務邏輯的類
(2) Join Point :連接點,切麵作用的位置
(3) Pointcut :切點,連接點的集合,通過切點表達式確定作用的位置
(4) Advice :通知,共通業務邏輯調用的時機,有前置通知,後置通知,最終通知,環繞通知,異常通知
(5) Target :目標對象,要加入切麵的對象
(6) Proxy :代理對象,加入切麵之後的對象,有jdk的代理和CGLIB兩種代理
29. mybatis框架構成和原理。
1) Mybatis框架主要由以下幾個方面構成
A.實體類——根據表設計的實體類
B.主配置文件——定義了連接資料庫的信息(mybatis自帶連接池),和載入sql定義 文件
C.sql定義文件——定義sql語句
D.mybatis框架api——主要是通過SqlSession來體現
2)mybatis原理
Mybatis應用程式根據主配置文件創建SqlSessionFactory對象,裡面載入了連接池和sql定義文件的信息,根據SqlSessionFactory創建SqlSession對象,利用SqlSession的api完成相應的持久層操作