java筆試題是大家比較關(guān)心的問題,因為在找工作的時候,都會有java筆試題的測試,這直接影響面試結(jié)果,深圳達內(nèi)教育java培訓(xùn)機構(gòu)的小編為大家準(zhǔn)備了java后臺開發(fā)筆試題匯總,有需要的小伙伴可以看一看。
1、使用Spring框架的好處是什么?
輕量:Spring是輕量的,基本的版本大約2MB
控制反轉(zhuǎn)(IOC):Spring通過控制反轉(zhuǎn)實現(xiàn)類松散耦合,對象們給出它們的依賴,而不是創(chuàng)建或查找依賴的對象們。
面向切面的編程(AOP):Spring支持面向切面的編程,并且把業(yè)務(wù)邏輯和系統(tǒng)服務(wù)分開。
容器:spring包含并管理應(yīng)用中對象的生命周期和配置。
MVC框架:Spring的WEB框架是個精心設(shè)計的框架,是Web框架的一個很好的替代品。
事務(wù)管理:Spring提供一個持續(xù)的事務(wù)管理接口,可以擴展到上至本地事務(wù)下至全局事務(wù)。
異常處理:Spring提供方便的API把具體技術(shù)相關(guān)的異常轉(zhuǎn)換為一致的unchecked異常。
2、Java工廠模式和Spring IOC的區(qū)別在哪?
Java工廠是在工廠中修改,在工廠中修改就要重修編譯工廠類,重新編譯的話就要先停了JVM再重新啟動。
Spring IOC是熱插拔的,在XML中直接修改,修改xmlspring就會立即發(fā)現(xiàn)你改動了XML,會再重新讀一遍XML,就會發(fā)現(xiàn)新改動了,根本不用重新啟動JVM。
3、ORM框架(Object relation mapping)有什么概念?
ORM對象關(guān)系映射關(guān)系,面向?qū)ο蟮膶ο竽P秃完P(guān)系型數(shù)據(jù)之間的相互轉(zhuǎn)換。
Hibernate和Mybatis都是常用的ORM框架,兩者區(qū)別:
(1)mybatis手寫SQL,而hibernate提供映射機制,開發(fā)人員無需擔(dān)心。
(2)mybatis控制更細粒度,但可移植型差,hibernate開發(fā)DAO很簡單,可移植性好。
(3)hibernate擁有完整的日志系統(tǒng),mybatis則欠缺一些
(4) mybatis相比hibernate需要關(guān)心很多細節(jié)
(5)sql直接優(yōu)化上,mybatis要比hibernate方便很多
4、數(shù)據(jù)庫事務(wù)的四大特性及事務(wù)隔離級別是什么?
(1)事務(wù)的四大特性:
原子性(Atomicity):事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾。
一致性(Consistency):一個事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。
隔離性(Isolation):當(dāng)多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如操作同一張表時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個并發(fā)事務(wù)之間要相互隔離。
持久性(Durability):一個事務(wù)一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務(wù)的操作。
(2)事務(wù)隔離:
更新丟失:兩事務(wù)同時更新,一個失敗回滾覆蓋另一個事務(wù)的更新。
臟讀:事務(wù)T1讀取到事務(wù)T2修改了但是還未提交的數(shù)據(jù),之后事務(wù)T2又回滾其更新操作,導(dǎo)致事務(wù)T1讀到的是臟數(shù)據(jù)。
不可重復(fù)讀:事務(wù)T1讀取某個數(shù)據(jù)后,事務(wù)T2對其做了修改,當(dāng)事務(wù)T1再次讀該數(shù)據(jù)時得到與前一次不同的值。
虛讀(幻讀):事務(wù)T1讀取在讀取某范圍數(shù)據(jù)時,事務(wù)T2又插入一條數(shù)據(jù),當(dāng)事務(wù)T1再次數(shù)據(jù)這個范圍數(shù)據(jù)時發(fā)現(xiàn)不一樣了,出現(xiàn)了一些“幻影行”。
不可重復(fù)讀和臟讀的區(qū)別:臟讀是某一事務(wù)讀取了另一個事務(wù)未提交的臟數(shù)據(jù),而不可重復(fù)讀則是讀取了前一事務(wù)提交的數(shù)據(jù)。
幻讀和不可重復(fù)讀的異同:都是讀取了另一條已經(jīng)提交的事務(wù)(這點就臟讀不同),所不同的是不可重復(fù)讀查詢的都是同一個數(shù)據(jù)項,而幻讀針對的是一批數(shù)據(jù)整體(比如數(shù)據(jù)的個數(shù))。
(3)事務(wù)隔離的級別:
讀未提交(1000):只限制同一數(shù)據(jù)寫事務(wù)禁止其他寫事務(wù)。解決”更新丟失”。
讀已提交(1100):只限制同一數(shù)據(jù)寫事務(wù)禁止其它讀寫事務(wù)。解決”臟讀”,以及”更新丟失”。
可重復(fù)讀(1110):限制同一數(shù)據(jù)寫事務(wù)禁止其他讀寫事務(wù),讀事務(wù)禁止其它寫事務(wù)(允許讀)。解決”不可重復(fù)讀”,以及”更新丟失”和”臟讀”。
串行化(1111):提供嚴(yán)格的事務(wù)隔離。它要求事務(wù)序列化執(zhí)行,事務(wù)只能一個接著一個地執(zhí)行,但不能并發(fā)執(zhí)行。如果僅僅通過“行級鎖”是無法實現(xiàn)事務(wù)序列化的,必須通過其他機制保證新插入的數(shù)據(jù)不會被剛執(zhí)行查詢操作的事務(wù)訪問到。
5、假設(shè)有一張用戶表,正常的表只能存放大概一千萬或是兩千萬左右的數(shù)據(jù),但是有上億的用戶?怎么存儲?
橫向分割或者縱向分割。
不太嚴(yán)格的將,對于海量數(shù)據(jù)的數(shù)據(jù)庫,如果是因為表多而數(shù)據(jù)多,這時候適合垂直切分,即把關(guān)系緊密的(比如同一模塊)的表切分出來出來放在一個servlet上。如果對于表并不多,但每張表的數(shù)據(jù)非常多,這時候就適合水平切分,即把表的數(shù)據(jù)按某種規(guī)則切分到對個數(shù)據(jù)庫(server)上。
可以橫向分割,把表分割成多個表然后分布式存儲。
6、庫函數(shù)和系統(tǒng)調(diào)用是什么?
(1)系統(tǒng)調(diào)用是為了方便應(yīng)用使用操作系統(tǒng)的接口,而庫函數(shù)是為了方便入門編寫應(yīng)用程序而引出的,比如自己編寫一個函數(shù)其實也可以說是一個庫函數(shù)。
(2)系統(tǒng)調(diào)用可以理解為內(nèi)核提供給我們在用戶態(tài)的接口函數(shù),可以認為是某種內(nèi)核的庫函數(shù)。
(3)read()函數(shù)是系統(tǒng)調(diào)用,而fread()函數(shù)是C標(biāo)準(zhǔn)庫函數(shù)。
7、Java設(shè)計模式有哪些?
創(chuàng)建型模式(5種):工廠方法模式,抽象工廠模式,單例模式,建造者模式,原型模式。
結(jié)構(gòu)型模式(7種):適配器模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。
行為型模式(11種):策略模式、模板方法模式、觀察者模式、迭代子模式、責(zé)任鏈模式、命令模式、備忘錄模式、狀態(tài)模式、訪問者模式、中介者模式、解釋器模式。
8、講講類的實例化順序,比如父類靜態(tài)數(shù)據(jù),構(gòu)造函數(shù),字段,子類靜態(tài)數(shù)據(jù),構(gòu)造函數(shù),字段,當(dāng)new的時候,他們的執(zhí)行順序。
父類靜態(tài)成員和靜態(tài)初始化塊 ,按在代碼中出現(xiàn)的順序依次執(zhí)行
子類靜態(tài)成員和靜態(tài)初始化塊 ,按在代碼中出現(xiàn)的順序依次執(zhí)行
結(jié)論:對象初始化的順序,先靜態(tài)方法,再構(gòu)造方法,每個又是先基類后子類
父類實例成員和實例初始化塊 ,按在代碼中出現(xiàn)的順序依次執(zhí)行
父類構(gòu)造方法
子類實例成員和實例初始化塊 ,按在代碼中出現(xiàn)的順序依次執(zhí)行
子類構(gòu)造方法
9、請你講述數(shù)組和鏈表數(shù)據(jù)結(jié)構(gòu)之間各自的時間復(fù)雜度。
數(shù)組,是將元素在內(nèi)存中連續(xù)存放,由于每個元素占用內(nèi)存相同,可以通過下標(biāo)迅速訪問數(shù)組中任何元素。但是如果要在數(shù)組中增加一個元素,需要移動大量元素,在內(nèi)存中空出一個元素的空間,然后將要增加的元素放在其中。同樣的道理,如果想刪除一個元素,同樣需要移動大量元素去填掉被移動的元素。如果應(yīng)用需要快速訪問數(shù)據(jù),很少插入和刪除元素,就應(yīng)該用數(shù)組。
鏈表 中的元素在內(nèi)存中不是順序存儲的,而是通過存在元素中的指針聯(lián)系到一起,每個結(jié)點包括兩個部分:一個是存儲 數(shù)據(jù)元素 的 數(shù)據(jù)域,另一個是存儲下一個結(jié)點地址的 指針。
如果要訪問鏈表中一個元素,需要從第一個元素開始,一直找到需要的元素位置。但是增加和刪除一個元素對于鏈表數(shù)據(jù)結(jié)構(gòu)就非常簡單了,只要修改元素中的指針就可以了。如果應(yīng)用需要經(jīng)常插入和刪除元素你就需要用鏈表。
內(nèi)存存儲區(qū)別
數(shù)組從棧中分配空間, 對于程序員方便快速,但自由度小。
鏈表從堆中分配空間, 自由度大但申請管理比較麻煩。
邏輯結(jié)構(gòu)區(qū)別
數(shù)組必須事先定義固定的長度(元素個數(shù)),不能適應(yīng)數(shù)據(jù)動態(tài)地增減的情況。當(dāng)數(shù)據(jù)增加時,可能超出原先定義的元素個數(shù);當(dāng)數(shù)據(jù)減少時,造成內(nèi)存浪費。
鏈表動態(tài)地進行存儲分配,可以適應(yīng)數(shù)據(jù)動態(tài)地增減的情況,且可以方便地插入、刪除數(shù)據(jù)項。(數(shù)組中插入、刪除數(shù)據(jù)項時,需要移動其它數(shù)據(jù)項)
總結(jié)
存取方式上,數(shù)組可以順序存取或者隨機存取,而鏈表只能順序存取;
存儲位置上,數(shù)組邏輯上相鄰的元素在物理存儲位置上也相鄰,而鏈表不一定;
存儲空間上,鏈表由于帶有指針域,存儲密度不如數(shù)組大;
按序號查找時,數(shù)組可以隨機訪問,時間復(fù)雜度為O(1),而鏈表不支持隨機訪問,平均需要O(n);
按值查找時,若數(shù)組無序,數(shù)組和鏈表時間復(fù)雜度均為O(1),但是當(dāng)數(shù)組有序時,可以采用折半查找將時間復(fù)雜度降為O(logn);
插入和刪除時,數(shù)組平均需要移動n/2個元素,而鏈表只需修改指針即可;
空間分配方面:
數(shù)組在靜態(tài)存儲分配情形下,存儲元素數(shù)量受限制,動態(tài)存儲分配情形下,雖然存儲空間可以擴充,但需要移動大量元素,導(dǎo)致操作效率降低,而且如果內(nèi)存中沒有更大塊連續(xù)存儲空間將導(dǎo)致分配失敗;
鏈表存儲的節(jié)點空間只在需要的時候申請分配,只要內(nèi)存中有空間就可以分配,操作比較靈活高效;
以上就是深圳達內(nèi)教育java培訓(xùn)機構(gòu)的小編針對“java后臺開發(fā)筆試題匯總”的內(nèi)容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。
Java筆試題