29道Java簡答題


--答案經過網絡整理,難免有重復的內容,感謝各位博主的無私奉獻

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. 線程的幾種狀態分別是什么?

wpsC088.tmp

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找到對應的視圖展示數據

wpsC098.tmp

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完成相應的持久層操作


免責聲明!

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



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