Java面試集錦
1.?html與jsp區(qū)別?
答:HTML是文本標(biāo)記語言,它是靜態(tài)頁面;JSP頁面是有JSP容器執(zhí)行該頁面的Java代碼部分然后實時生成動態(tài)頁面,可動態(tài)更新頁面上的內(nèi)容。
在jsp中用<%%>就可以寫Java代碼了,而html沒有<%%>,html需要將對象轉(zhuǎn)換為Json進(jìn)行交互,不建議在jsp中寫java代碼,導(dǎo)致代碼混亂。
2.?什么是Jsp自定義標(biāo)簽?
答:在jsp開發(fā)時,當(dāng)jsp內(nèi)置標(biāo)簽以及JSTL標(biāo)簽庫都滿足不了需求時,可以根據(jù)自己的需求來自定義標(biāo)簽。其實在jsp頁面使用標(biāo)簽就等同于調(diào)用某個對象的某個方法。繼承TagSupport,編寫TLD。
3.?GET和POST兩種基本請求方法的區(qū)別
答:
1.GET請求在URL中傳送的參數(shù)是有長度限制的,而POST沒有。
2.GET比POST更不安全,因為參數(shù)直接暴露在URL上,所以不能用來傳遞敏感信息。
3.GET參數(shù)通過URL傳遞,POST放在Requestbody中。
4.GET請求參數(shù)會被完整保留在瀏覽器歷史記錄里,而POST中的參數(shù)不會被保留。
5.GET請求只能進(jìn)行url編碼,而POST支持多種編碼方式。
6.GET請求會被瀏覽器主動cache,而POST不會,除非手動設(shè)置。
7.GET產(chǎn)生的URL地址可以被Bookmark,而POST不可以。
8.GET在瀏覽器回退時是無害的,而POST會再次提交請求。
GET和POST本質(zhì)上沒有區(qū)別,HTTP協(xié)議中的兩種發(fā)送請求的方法,GET產(chǎn)生一個TCP數(shù)據(jù)包;POST產(chǎn)生兩個TCP數(shù)據(jù)包。因為POST需要兩步,時間上消耗的要多一點,看起來GET比POST更有效。因此Yahoo團(tuán)隊有推薦用GET替換POST來優(yōu)化網(wǎng)站性能。但這是一個坑!跳入需謹(jǐn)慎。為什么?
1. GET與POST都有自己的語義,不能隨便混用。
2. 據(jù)研究,在網(wǎng)絡(luò)環(huán)境好的情況下,發(fā)一次包的時間和發(fā)兩次包的時間差別基本可以無視。而在網(wǎng)絡(luò)環(huán)境差的情況下,兩次包的TCP在驗證數(shù)據(jù)包完整性上,有非常大的優(yōu)點。
3. 并不是所有瀏覽器都會在POST中發(fā)送兩次包,F(xiàn)irefox就只發(fā)送一次。
4.?jquery選擇器有哪幾種?
答:
1.元素選擇器:$("p")
2. id選擇器:$("#test")
3. .class 選擇器:$(".test")
5.?jQuery 庫中的 $() 是什么?
答:$() 函數(shù)是 jQuery() 函數(shù)的別稱,$() 函數(shù)用于將任何對象包裹成 jQuery 對象,接著你就被允許調(diào)用定義在 jQuery 對象上的多個不同方法。
6.?$(document).ready() 是個什么函數(shù)?為什么要用它?
答:當(dāng)DOM 完全加載(例如HTML被完全解析DOM樹構(gòu)建完成時),jQuery允許你執(zhí)行代碼
7.?哪種方式更高效:document.getElementbyId("myId"),還是 $("#myId")?常用的是哪種?
答:第一種,因為它直接調(diào)用了 JavaScript 引擎;$("#myId")。
8.?EasyUI DataGrid是什么?
答:?DataGrid以表格形式展示數(shù)據(jù),并提供了豐富的選擇、排序、分組和編輯數(shù)據(jù)的功能支持。是否支持單元格合并、多列標(biāo)題、凍結(jié)列功能?
9.? EasyUI Combobox是什么?
組合框(combobox)顯示一個可編輯的文本框和下拉列表,用戶可以從下拉列表中選擇一個或多個值。用戶可以直接輸入文本到列表的頂部,或者從列表中選擇一個或多個現(xiàn)成的值。
后端(java基礎(chǔ))
1. 八種基本數(shù)據(jù)類型的大小,以及他們的封裝類
八種基本數(shù)據(jù)類型:int、short、float、double、long、boolean、byte、char。
封裝類分別是:Integer、Short、Float、Double、Long、Boolean、Byte、Character。
2. 什么是自動裝箱拆箱??
裝箱就是自動將基本數(shù)據(jù)類型轉(zhuǎn)換為包裝器類型;拆箱就是自動將包裝器類型轉(zhuǎn)換為基本數(shù)據(jù)類型。
3. Object是所有類的父類,任何類都默認(rèn)繼承Object。
4. String、StringBuffer與StringBuilder的區(qū)別
String:適用于少量的字符串操作的情況。
StringBuilder:適用于單線程下在字符緩沖區(qū)進(jìn)行大量操作的情況。
StringBuffer:適用多線程下在字符緩沖區(qū)進(jìn)行大量操作的情況。
StringBuilder:是線程不安全的,而StringBuffer是線程安全的。
運行速度快慢為:StringBuilder > StringBuffer > String。
String最慢的原因::String為字符串常量,而StringBuilder和StringBuffer均為字符串變量,即String對象一旦創(chuàng)建之后該對象是不可更改的,但后兩者的對象是變量,是可以更改的。
5. Map、Set、List
Map是鍵值對,鍵Key是唯一不能重復(fù)的,一個鍵對應(yīng)一個值,值可以重復(fù)。
HashMap不保證順序,即為無序的。
TreeMap可以保證順序。
Set不包含重復(fù)元素的集合,有序的。
List有序的可重復(fù)集合。
6. try?catch?finally,try里有return,finally還執(zhí)行么
肯定會執(zhí)行finally{}塊的代碼。只有在try{}塊中包含遇到System.exit(0)之類的導(dǎo)致Java虛擬機(jī)直接退出的語句才會不執(zhí)行。
當(dāng)程序執(zhí)行try{}遇到return時,程序會先執(zhí)行return語句,但并不會立即返回,也就是把return語句要做的一切事情都準(zhǔn)備好,在將要返回、但并未返回的時候,程序把執(zhí)行流程轉(zhuǎn)去執(zhí)行finally塊,當(dāng)finally塊執(zhí)行完成后就直接返回剛才return語句已經(jīng)準(zhǔn)備好的結(jié)果。
7. IO與NIO
NIO是為了彌補IO操作的不足而誕生的,NIO的一些新特性有:非阻塞I/O,選擇器,緩沖以及管道。管道(Channel),緩沖(Buffer),選擇器( Selector)是其主要特征。
IO是面向流的,NIO是面向塊(緩沖區(qū))的。
IO是阻塞的,NIO是非阻塞的。
那么NIO和IO各適用的場景是什么呢?
如果需要管理同時打開的成千上萬個連接,這些連接每次只是發(fā)送少量的數(shù)據(jù),例如聊天服務(wù)器,這時候用NIO處理數(shù)據(jù)可能是個很好的選擇。
而如果只有少量的連接,而這些連接每次要發(fā)送大量的數(shù)據(jù),這時候傳統(tǒng)的IO更合適。使用哪種處理數(shù)據(jù),需要在數(shù)據(jù)的響應(yīng)等待時間和檢查緩沖區(qū)數(shù)據(jù)的時間上作比較來權(quán)衡選擇。
8. 什么是Java的反射?
Java 反射是可以讓我們在運行時,通過一個類的Class對象來獲取它獲取類的方法、屬性、父類、接口等類的內(nèi)部信息的機(jī)制。
這種動態(tài)獲取信息以及動態(tài)調(diào)用對象的方法的功能稱為JAVA的反射。
應(yīng)用場景:
反射技術(shù)常用在各類通用框架開發(fā)中。因為為了保證框架的通用性,需要根據(jù)配置文件加載不同的對象或類,并調(diào)用不同的方法,這個時候就會用到反射——運行時動態(tài)加載需要加載的對象。
特點:
由于反射會額外消耗一定的系統(tǒng)資源,因此如果不需要動態(tài)地創(chuàng)建一個對象,那么就不需要用反射。另外,反射調(diào)用方法時可以忽略權(quán)限檢查,因此可能會破壞封裝性而導(dǎo)致安全問題。
9. 悲觀鎖與樂觀鎖
悲觀鎖總是假設(shè)最壞的情況,每次去拿數(shù)據(jù)的時候都認(rèn)為別人會修改,所以每次在拿數(shù)據(jù)的時候都會上鎖,這樣別人想拿這個數(shù)據(jù)就會阻塞直到它拿到鎖(共享資源每次只給一個線程使用,其它線程阻塞,用完后再把資源轉(zhuǎn)讓給其它線程)。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機(jī)制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。
樂觀鎖總是假設(shè)最好的情況,每次去拿數(shù)據(jù)的時候都認(rèn)為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數(shù)據(jù),可以使用版本號機(jī)制實現(xiàn)。樂觀鎖適用于多讀的應(yīng)用類型,這樣可以提高吞吐量。
兩種鎖的使用場景:
樂觀鎖適用于寫比較少的情況下(多讀場景),即沖突真的很少發(fā)生的時候,這樣可以省去了鎖的開銷,加大了系統(tǒng)的整個吞吐量。但如果是多寫的情況,一般會經(jīng)常產(chǎn)生沖突,這就會導(dǎo)致上層應(yīng)用會不斷的進(jìn)行retry,這樣反倒是降低了性能,所以一般多寫的場景下用悲觀鎖就比較合適。
10. 什么是設(shè)計模式
設(shè)計模式是一種解決方案,用于解決在軟件設(shè)計中普遍存在的問題,是前輩們對之前軟件設(shè)計中反復(fù)出現(xiàn)的問題的一個總結(jié)。常用模式有單例模式,工廠模式,代理模式,模板模式,觀察者模式。
單例設(shè)計模式懶漢式和惡漢式:
懶漢式在類加載時不初始化,延遲加載。(配置文件)
餓漢式在類加載時初始化,加載慢,獲取對象快。
餓漢式是線程安全的,懶漢式需要加synchronized,否則不安全。
11.Spring AOP是什么
AOP(Aspect Oriented Programming) 面向切面編程,利用AOP可以對業(yè)務(wù)邏輯的各個部分隔離,從而使的業(yè)務(wù)邏輯各部分的耦合性降低,提高程序的可重用性,提高開發(fā)效率,主要功能:日志記錄,性能統(tǒng)計,安全控制,事務(wù)處理,異常處理等。
AOP實現(xiàn)原理是java動態(tài)代理,但是jdk的動態(tài)代理必須實現(xiàn)接口,所以spring的aop是用cglib這個庫實現(xiàn)的。
12.AOP與OOP的區(qū)別
OOP面向?qū)ο缶幊蹋槍I(yè)務(wù)處理過程的實體及其屬性和行為進(jìn)行抽象封裝,以獲得更加清晰高效的邏輯單元劃分。而AOP則是針對業(yè)務(wù)處理過程中的切面進(jìn)行提取,它所面對的是處理過程的某個步驟或階段,以獲得邏輯過程的中各部分之間低耦合的隔離效果。這兩種設(shè)計思想在目標(biāo)上有著本質(zhì)的差異。
13.Spring IOC是什么
Java特性:多態(tài),繼承,封裝;為什么類的屬性要定義為私有的?
控制反轉(zhuǎn),由spring自動生產(chǎn),使用java的反射機(jī)制,根據(jù)配置文件在運行時動態(tài)的去創(chuàng)建對象以及管理對象,并調(diào)用對象的方法;依賴注入,有三種注入方式:構(gòu)造器注入、setter方法注入、根據(jù)注解注入。
14.Spring事務(wù)的實現(xiàn)方式和實現(xiàn)原理:
Spring事務(wù)的本質(zhì)其實就是數(shù)據(jù)庫對事務(wù)的支持,沒有數(shù)據(jù)庫的事務(wù)支持,spring是無法提供事務(wù)功能的。真正的數(shù)據(jù)庫層的事務(wù)提交和回滾是通過binlog或者redo log實現(xiàn)的。
15.臟讀,不可重復(fù)讀,幻讀
常用傳播行為:PROPAGATION_REQUIRED:如果當(dāng)前沒有事務(wù),就創(chuàng)建一個新事務(wù),如果當(dāng)前存在事務(wù),就加入該事務(wù)。
MySQL的事務(wù)隔離級別一共有四個:
MySQL的默認(rèn)事務(wù)隔離級別是:RepeatableRead(可重復(fù)讀),會導(dǎo)致出現(xiàn)幻讀。
臟讀:通俗的講,一個事務(wù)在處理過程中讀取了另外一個事務(wù)未提交的數(shù)據(jù)。
你都還沒提交,我就讀到了你剛操作的數(shù)據(jù),萬一你回滾了怎么辦,你說這臟不臟。
不可重復(fù)讀(Non-repeatable Read):通俗的講,一個事務(wù)范圍內(nèi),多次查詢某個數(shù)據(jù),卻得到不同的結(jié)果。
幻讀: 事務(wù)A 按照一定條件進(jìn)行數(shù)據(jù)讀取,期間事務(wù)B 插入了相同搜索條件的新數(shù)據(jù),事務(wù)A再次按照原先條件進(jìn)行讀取時,發(fā)現(xiàn)了事務(wù)B 新插入的數(shù)據(jù)稱為幻讀。
16.什么是Spring MVC ?簡單介紹下你對springMVC的理解?
Spring MVC是一個基于Java的實現(xiàn)了MVC設(shè)計模式的請求驅(qū)動類型的輕量級Web框架,通過把Model,View,Controller分離,將web層進(jìn)行職責(zé)解耦,把復(fù)雜的web應(yīng)用分成邏輯清晰的幾部分,簡化開發(fā),減少出錯,方便組內(nèi)開發(fā)人員之間的配合。
17.SpringMVC的流程?
(1)用戶發(fā)送請求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到請求后,調(diào)用HandlerMapping處理器映射器,請求獲取Handle;
(3)處理器映射器根據(jù)請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet;
(4)DispatcherServlet 調(diào)用 HandlerAdapter處理器適配器;
(5)HandlerAdapter 經(jīng)過適配調(diào)用
具體處理器(Handler,也叫后端控制器);
(6)Handler執(zhí)行完成返回ModelAndView;
(7)HandlerAdapter將Handler執(zhí)行結(jié)果ModelAndView返回給DispatcherServlet;
(8)DispatcherServlet將ModelAndView傳給ViewResolver視圖解析器進(jìn)行解析;
(9)ViewResolver解析后返回具體View;
(10)DispatcherServlet對View進(jìn)行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)
(11)DispatcherServlet響應(yīng)用戶。
18. SpringMVC怎么樣設(shè)定重定向和轉(zhuǎn)發(fā)的?
(1)轉(zhuǎn)發(fā):在返回值前面加"forward:",譬如"forward:user.do?name=sourcebyte"
(2)重定向:在返回值前面加"redirect:",譬如"redirect:https://www.sourcebyte.vip"
19.Spring MVC的異常處理 ?
答:可以將異常拋給Spring框架,由Spring框架來處理;我們只需要配置簡單的異常處理器,在異常處理器中添視圖頁面即可。
20.如果前臺有很多個參數(shù)傳入,并且這些參數(shù)都是一個對象的,那么怎么樣快速得到這個對象?
答:直接在方法中聲明這個對象,SpringMvc就自動會把屬性賦值到這個對象里面。
21.SpringMvc中函數(shù)的返回值是什么?
答:返回值可以有很多類型,有String, ModelAndView。ModelAndView類把視圖和數(shù)據(jù)都合并的一起的,但一般用String比較好。
22.hibernate get和load區(qū)別
(1)get如果沒有找到會返回null, load如果沒有找到會拋出異常。
(2)get會先查一級緩存,再查二級緩存,然后查數(shù)據(jù)庫;load會先查一級緩存,如果沒有找到,就創(chuàng)建代理對象,等需要的時候去查詢二級緩存和數(shù)據(jù)庫。
23. Hibernate中的三種數(shù)據(jù)狀態(tài)
臨時態(tài)(瞬時態(tài)/Transient),持久態(tài)(Persistent),游離態(tài)(脫管態(tài)/Detached)
24.Hibernate有哪幾種查詢數(shù)據(jù)的方式
3種:hql、條件查詢QBC(QueryByCriteria)、原生sql (通過createSQLQuery建立)
25. Hibernate是如何延遲加載
配置LAZY屬性FetchType.LAZY。
26.Hibernate中怎樣實現(xiàn)類之間的關(guān)系?(如:一對多、多對多的關(guān)系)
類與類之間的關(guān)系主要體現(xiàn)在表與表之間的關(guān)系進(jìn)行操作,它們都是對對象進(jìn)行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many。
27.delete、drop、truncate區(qū)別
truncate?和?delete只刪除數(shù)據(jù),不刪除表結(jié)構(gòu),drop刪除表結(jié)構(gòu),并且釋放所占的空間。刪除數(shù)據(jù)的速度,drop> truncate > delete。
delete屬于DML語言,需要事務(wù)管理,commit之后才能生效。drop和truncate屬于DDL語言,操作立刻生效,不可回滾。
使用場合:
當(dāng)你不再需要該表時,用?drop;當(dāng)你仍要保留該表,但要刪除所有記錄時,用?truncate;當(dāng)你要刪除部分記錄時(always with a where clause),?用?delete。
28. 導(dǎo)致SQL執(zhí)行慢的原因:
1.硬件問題。如網(wǎng)絡(luò)速度慢,內(nèi)存不足,I/O吞吐量小,磁盤空間滿了等。
2.沒有索引或者索引失效。(一般在互聯(lián)網(wǎng)公司,DBA會在半夜把表鎖了,重新建立一遍索引,因為當(dāng)你刪除某個數(shù)據(jù)的時候,索引的樹結(jié)構(gòu)就不完整了。所以互聯(lián)網(wǎng)公司的數(shù)據(jù)做的是假刪除.一是為了做數(shù)據(jù)分析,二是為了不破壞索引)。
3.數(shù)據(jù)過多(分庫分表)。
4.服務(wù)器調(diào)優(yōu)及各個參數(shù)設(shè)置(調(diào)整my.cnf)。
5.分析原因,找切入點
?1).先觀察,開啟慢查詢?nèi)罩?,設(shè)置相應(yīng)的閾值(比如超過3秒就是慢SQL),在生產(chǎn)環(huán)境跑上個一天過后,看看哪些SQL比較慢。
?2).Explain和慢SQL分析。比如SQL語句寫的爛,索引沒有或失效,關(guān)聯(lián)查詢太多(有時候是設(shè)計缺陷或者不得以的需求)等等。
?3).Show Profile是比Explain更近一步的執(zhí)行細(xì)節(jié),可以查詢到執(zhí)行每一個SQL都干了什么事,這些事分別花了多少秒。
29.什么是索引?
索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。我們可以簡單理解為:快速查找排好序的一種數(shù)據(jù)結(jié)構(gòu)。

如若轉(zhuǎn)載,請注明出處:開源字節(jié) ? https://sourcebyte.vip/article/318.html