此文已經(jīng)同步至個人站點博客井赌,點擊下方鏈接可以體驗更加閱讀模式:
《java題庫》
基本概念
1.操作系統(tǒng)中 heap 和 stack 的區(qū)別
堆:(對象)引用類型變量伶椿,內(nèi)存分配在堆上或者常量池(字符串常量,基本數(shù)據(jù)類型常量)菊霜,需要通過new等方式來創(chuàng)建坚冀。堆內(nèi)存主要作用是存放運行時創(chuàng)建(new)的對象。
存取速度慢鉴逞,可以運行時動態(tài)分配內(nèi)存记某,生存期不需要提前確定
棧:(基本數(shù)據(jù)類型司训、對象的應(yīng)用變量)
八種基本數(shù)據(jù)類型以及對象的應(yīng)用變量,在棧上液南,變量出了作用域就會自動釋放壳猜。棧內(nèi)存的主要作用就是存放基本數(shù)據(jù)類型和引用變量。內(nèi)存管理師通過“椈梗”的后進先出模式來實現(xiàn)统扳。
主要用來執(zhí)行程序,存取速度快畅姊,大小和生存期必須確定咒钟,缺乏靈活性。
2.什么是基于注解的切面實現(xiàn)
aop是spring框架里一個經(jīng)典的切面實現(xiàn)方式若未,?AOP采取橫向抽取機制朱嘴,取代了傳統(tǒng)縱向繼承體系重復(fù)性代碼。Spring除了支持Schema方式配置AOP粗合,還支持注解方式:使用@AspectJ風(fēng)格的切面聲明萍嬉。
3.什么是對象/關(guān)系 映射集成模塊
ORM,object ralational Mapping隙疚。解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫存在互補匹配的技術(shù)壤追。ORM通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將程序中的對象自動持久化到關(guān)系數(shù)據(jù)庫中甚淡。
4.什么是java的反射機制
在運行狀態(tài)中大诸,對于任意一個類,都能知道這個類的所有屬性和方法贯卦,對于任意一個對象资柔,都能調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取信息以及動態(tài)調(diào)用對象的方法就是java語言的反射機制撵割。
5贿堰。什么是ACID?
一個數(shù)據(jù)庫事務(wù)正確執(zhí)行的四個基本要素啡彬。automicity原子性羹与,consistency一致性,isolation隔離性庶灿,durability持久性
6.BS與CS的聯(lián)系與區(qū)別
cs響應(yīng)速度快纵搁,安全性強,一般應(yīng)用于局域網(wǎng)中往踢,但是開發(fā)維護成本高腾誉;bs可以實現(xiàn)跨平臺,客戶端零維護,但是個性化能力低利职,響應(yīng)速度慢趣效。
7.Cookie 和 Session的區(qū)別
cookie數(shù)據(jù)保存在客戶瀏覽器中,session數(shù)據(jù)保存在服務(wù)器上猪贪。
前者不是很安全跷敬,別人可以分析存放在本地的cookie并進行cookie欺騙,考慮安全的話應(yīng)該使用session
session會在一定時間內(nèi)保存在服務(wù)器上热押,當(dāng)訪問增多西傀,會比較多的占用服務(wù)器性能±慊疲考慮到減服務(wù)器性能池凄,可使用cookie
單個cookie保存數(shù)據(jù)不能超過4k,瀏覽器限制一個站點最多保存20個cookie
登陸等重要信息放在session鬼廓,其他信息需要保留就放在cookie中。
8.fail-fast 與 fail-safe 機制有什么區(qū)別(另外一個知識點:遍歷集合時對集合進行修改操作的安全操作)
快速失斨旅恕:當(dāng)你在迭代一個集合的時候碎税,如果有另一個線程正在修改你正在訪問的那個集合時,就會拋出一個ConcurrentModification
異常馏锡。
在java.util
包下的都是快速失敗雷蹂。
安全失敗:采用安全失敗機制的集合容器杯道,在遍歷時不是直接在集合內(nèi)容上訪問的匪煌,而是先復(fù)制原有集合內(nèi)容,在拷貝的集合上進行遍歷党巾。
在java.util.concurrent包下的全是安全失敗的萎庭。
(原理說明)
快速失敗原理:迭代器在遍歷時直接訪問集合中的內(nèi)容,并且在遍歷過程中使用一個 modCount
變量齿拂。集合在被遍歷期間如果內(nèi)容發(fā)生變化驳规,就會改變modCount
的值。每當(dāng)?shù)魇褂?code>hashNext()/next()
遍歷下一個元素之前署海,都會檢測modCount變量是否為expectedmodCount值吗购,是的話就返回遍歷;否則拋出異常砸狞,終止遍歷捻勉。
注意:這里異常的拋出條件是檢測到 modCount!=expectedmodCount
這個條件刀森。如果集合發(fā)生變化時修改modCount
值剛好又設(shè)置為了expectedmodCount
值踱启,則異常不會拋出。因此,不能依賴于這個異常是否拋出而進行并發(fā)操作的編程禽捆,這個異常只建議用于檢測并發(fā)修改的bug笙什。
場景:java.util
包下的集合類都是快速失敗的,不能在多線程下發(fā)生并發(fā)修改(迭代過程中被修改)胚想。
安全失敗原理:由于迭代時是對原集合的拷貝進行遍歷琐凭,所以在遍歷過程中對原集合所作的修改并不能被迭代器檢測到,所以不會觸發(fā)Concurrent Modification Exception
浊服。
缺點:基于拷貝內(nèi)容的優(yōu)點是避免了Concurrent Modification Exception
统屈,但同樣地,迭代器并不能訪問到修改后的內(nèi)容牙躺,即:迭代器遍歷的是開始遍歷那一刻拿到的集合拷貝愁憔,在遍歷期間原集合發(fā)生的修改迭代器是不知道的。
場景:java.util.concurrent
包下的容器都是安全失敗孽拷,可以在多線程下并發(fā)使用吨掌,并發(fā)修改。
9.get
和 post
請求的區(qū)別
get
是從服務(wù)器上獲取數(shù)據(jù)脓恕,post
是向服務(wù)器傳送數(shù)據(jù)膜宋。
a、GET請求炼幔,請求的數(shù)據(jù)會附加在URL之后秋茫,以?分割URL和傳輸數(shù)據(jù),多個參數(shù)用&連接乃秀。URL的編碼格式采用的是ASCII編碼肛著,而不是uniclde,即是說所有的非ASCII字符都要編碼之后再傳輸跺讯。
POST請求:POST請求會把請求的數(shù)據(jù)放置在HTTP請求包的包體中枢贿。
因此,GET請求的數(shù)據(jù)會暴露在地址欄中抬吟,而POST請求則不會萨咕。(ajax請求則不會暴露)
b、傳輸數(shù)據(jù)的大小
在HTTP規(guī)范中火本,沒有對URL的長度和傳輸?shù)臄?shù)據(jù)大小進行限制危队。但是在實際開發(fā)過程中,對于GET钙畔,特定的瀏覽器和服務(wù)器對URL的長度有限制茫陆。因此,在使用GET請求時擎析,傳輸數(shù)據(jù)會受到URL長度的限制簿盅。
對于POST挥下,由于不是URL傳值,理論上是不會受限制的桨醋,但是實際上各個服務(wù)器會規(guī)定對POST提交數(shù)據(jù)大小進行限制棚瘟,Apache、IIS都有各自的配置喜最。
c偎蘸、安全性
POST的安全性比GET的高。這里的安全是指真正的安全瞬内,而不同于上面GET提到的安全方法中的安全迷雪,上面提到的安全僅僅是不修改服務(wù)器的數(shù)據(jù)。比如虫蝶,在進行登錄操作章咧,通過GET請求,用戶名和密碼都會暴露再URL上能真,因為登錄頁面有可能被瀏覽器緩存以及其他人查看瀏覽器的歷史記錄的原因赁严,此時的用戶名和密碼就很容易被他人拿到了。除此之外舟陆,GET請求提交的數(shù)據(jù)還可能會造成Cross-site request frogery
攻擊
d误澳、HTTP中的GET,POST秦躯,SOAP協(xié)議都是在HTTP上運行的
10、Interface 與 abstract 類的區(qū)別
A. interface需要實現(xiàn)裆装,要用implements踱承,而abstract class需要繼承,要用extends哨免。
B. 一個類可以實現(xiàn)多個interface茎活,但一個類只能繼承一個abstract class。
C. interface強調(diào)特定功能的實現(xiàn)琢唾,而abstractclass強調(diào)所屬關(guān)系载荔。
D. 盡管interface實現(xiàn)類及abstrct class的子類都必須要實現(xiàn)相應(yīng)的抽象方法,但實現(xiàn)的形式不同采桃。interface中的每一個方法都是抽象方法懒熙,實現(xiàn)類必須要實現(xiàn)。而abstract class的子類可以有選擇地實現(xiàn)普办。
11工扎、IOC的優(yōu)點是什么
OC(Inversion of Control)控制反轉(zhuǎn),將控制權(quán)(創(chuàng)建對象和對象之間的依賴關(guān)系的權(quán)利)交給spring容器衔蹲≈铮可以靈活提供不同的子類實現(xiàn)(其實就是解耦),提高程序的靈活性、可擴展性和可維護性。
IoC不是一種技術(shù)橱健,只是一種思想而钞,一個重要的面向?qū)ο缶幊痰姆▌t,它能指導(dǎo)我們?nèi)绾卧O(shè)計出松耦合拘荡、更優(yōu)良的程序臼节。傳統(tǒng)應(yīng)用程序都是由我們在類內(nèi)部主動創(chuàng)建依賴對象,從而導(dǎo)致類與類之間高耦合俱病,難于測試官疲;有了IoC容器后,把創(chuàng)建和查找依賴對象的控制權(quán)交給了容器亮隙,由容器進行注入組合對象途凫,所以對象與對象之間是松散耦合,這樣也方便測試溢吻,利于功能復(fù)用维费,更重要的是使得程序的整個體系結(jié)構(gòu)變得非常靈活。
12促王、IO 和 NIO的區(qū)別犀盟,NIO優(yōu)點
面向流和面向緩沖;阻塞IO和非阻塞IO蝇狼;NIO還有選擇器的概念
- 不需要使用read()或者write()操作就可以處理文件內(nèi)容了
- 修改文件后阅畴,修改自動flush到文件
- nio方式能很快處理大文件和處理效率很快
13、Java 8 / Java 7 為我們提供了什么新功能
- switch支持字符串;
- 在try catch異常撲捉中迅耘,一個catch可以寫多個異常類型贱枣,用"|"隔開;
- 數(shù)值可以加下劃線颤专,int one_million = 1_000_000;
- 泛型簡化纽哥,代碼書寫更節(jié)省
- try-with-resource,AutoCloseable接口實現(xiàn)自動關(guān)閉栖秕,在try()中
以下為java8的新特性: - lambda表達式(重要春塌,學(xué)會寫迭代簡化forEach->和匿名內(nèi)部類簡化()->,importNew的博客關(guān)于java8新特性學(xué)習(xí)),
- 接口的默認(rèn)方法和靜態(tài)方法
方法引用 - java.time下包含了全新的時間日期API
- 支持多重注解
14簇捍、什么是競態(tài)條件只壳? 舉個例子說明。
當(dāng)兩個線程競爭同一資源時垦写,如果對資源的訪問順序敏感吕世,就稱存在競態(tài)條件。導(dǎo)致競態(tài)條件發(fā)生的代碼區(qū)稱作臨界區(qū)梯投。在臨界區(qū)中使用適當(dāng)?shù)耐骄涂梢员苊飧倯B(tài)條件命辖。
臨界區(qū)實現(xiàn)方法有兩種况毅,一種是用synchronized,一種是用Lock顯式鎖實現(xiàn)
class Counter {
protected long count = 0;
public void add(long value) {
this.count = this.count + value;
}
}
//在main函數(shù)中執(zhí)行下列方法:
Count c=new Count();
new Thread(()->{c.add(2l);}).start();
new Thread(()->{c.add(3l);}).start();
System.out.println(c.getCount());
觀察線程A和B交錯執(zhí)行會發(fā)生什么尔艇,兩個線程分別加了2和3到count變量上尔许,兩個線程執(zhí)行結(jié)束后count變量的值應(yīng)該等于5。然而由于兩個線程是交叉執(zhí)行的终娃,兩個線程從內(nèi)存中讀出的初始值都是0味廊。然后各自加了2和3,并分別寫回內(nèi)存棠耕。最終的值并不是期望的5余佛,而是最后寫回內(nèi)存的那個線程的值,上面例子中最后寫回內(nèi)存的是線程A窍荧,但實際中也可能是線程B辉巡。如果沒有采用合適的同步機制,線程間的交叉執(zhí)行情況就無法預(yù)料蕊退。
add()
方法就是一個臨界區(qū),它會產(chǎn)生競態(tài)條件郊楣。
15、JRE瓤荔、JDK净蚤、JVM 及 JIT 之間有什么不同?
我們利用JDK(調(diào)用JAVA API)開發(fā)了屬于我們自己的JAVA程序后输硝,通過JDK中的編譯程序(javac)將我們的文本java文件編譯成JAVA字節(jié)碼今瀑,在JRE上運行這些JAVA字節(jié)碼,JVM解析這些字節(jié)碼点把,映射到CPU指令集或OS的系統(tǒng)調(diào)用
---以下為詳情------
JDK : Java Development ToolKit
(Java開發(fā)工具包)放椰。JDK是整個JAVA的核心,包括了Java運行環(huán)境(Java Runtime Envirnment)愉粤,一堆Java工具(javac/java/jdb等)和Java基礎(chǔ)的類庫(即Java API 包括rt.jar)。
JRE:Java Runtime Enviromental
(java運行時環(huán)境)拿撩。也就是我們說的JAVA平臺衣厘,所有的Java程序都要在JRE下才能運行。包括JVM和JAVA核心類庫和支持文件压恒。與JDK相比影暴,它不包含開發(fā)工具——編譯器、調(diào)試器和其它工具探赫。
JVM:Java Virtual Mechinal
(JAVA虛擬機)型宙。JVM是JRE的一部分,它是一個虛構(gòu)出來的計算機伦吠,是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的妆兑。JVM有自己完善的硬件架構(gòu)魂拦,如處理器、堆棧搁嗓、寄存器等芯勘,還具有相應(yīng)的指令系統(tǒng)。JVM 的主要工作是解釋自己的指令集(即字節(jié)碼)并映射到本地的 CPU 的指令集或 OS 的系統(tǒng)調(diào)用腺逛。Java語言是跨平臺運行的荷愕,其實就是不同的操作系統(tǒng),使用不同的JVM映射規(guī)則棍矛,讓其與操作系統(tǒng)無關(guān)安疗,完成了跨平臺性。JVM 對上層的 Java 源文件是不關(guān)心的,它關(guān)注的只是由源文件生成的類文件( class file )。類文件的組成包括 JVM 指令集撩鹿,符號表以及一些補助信息温赔。
使用即時編譯器技術(shù),能夠加速 Java 程序的執(zhí)行速度,在運行時 JIT 會把翻譯過的機器碼保存起來准夷,以備下次使用,因此從理論上來說,采用該 JIT 技術(shù)可以接近以前純編譯技術(shù)厌小。
https://www.ibm.com/developerworks/cn/java/j-lo-just-in-time/
16、MVC的各個部分都有那些技術(shù)來實現(xiàn)?如何實現(xiàn)?
MVC 是 Model-View-Controller 的簡寫
- "Model" 代表的是應(yīng)用的業(yè)務(wù)邏輯(通過JavaBean战秋,EJB 組件實現(xiàn))璧亚,
- "View" 是應(yīng)用的表示面(由 JSP 頁面產(chǎn)生),
- "Controller"是提供應(yīng)用的處理過程控制(一般是一個 Servlet)脂信,通過這種設(shè)計模型把應(yīng)用邏輯癣蟋,處理過程和顯示邏輯分成不同的組件實現(xiàn)。這些組件可以進行交互和重用
17狰闪、RPC 通信和 RMI 區(qū)別疯搅?
- RPC 不支持對象, 采用http協(xié)議
- RMI支持傳輸對象埋泵。采用tcp/ip 協(xié)議
- RMI只限于JAVA語言幔欧,RPC跨語言
18、什么是 Web Service(Web服務(wù))
WebService是一種跨編程語言和跨操作系統(tǒng)平臺的遠程調(diào)用技術(shù)丽声。簡單點來說礁蔗,WebService就是一個應(yīng)用程序向外界暴露出一個能通過Web進行調(diào)用的API,也就是說能用編程的方法通過Web來調(diào)用這個應(yīng)用程序雁社。我們把調(diào)用這個WebService的應(yīng)用程序叫做客戶端浴井,而把提供這個WebService的應(yīng)用程序叫做服務(wù)端。從深層次看霉撵,WebService是建立可互操作的分布式應(yīng)用程序的新平臺磺浙,是一個平臺洪囤,是一套標(biāo)準(zhǔn)。它定義了應(yīng)用程序如何在Web上實現(xiàn)互操作性屠缭,你可以用任何你喜歡的語言箍鼓,在任何你喜歡的平臺上寫Web service ,只要我們可以通過Web service標(biāo)準(zhǔn)對這些服務(wù)進行查詢和訪問呵曹。
19款咖、JSWDL開發(fā)包的介紹。JAXP奄喂、JAXM的解釋铐殃。SOAP、UDDI,WSDL解釋跨新。
20富腊、WEB容器主要有哪些功能? 并請列出一些常見的WEB容器名字。
通信支持:利用容器提供的方法域帐,你可以簡單的實現(xiàn)servlet與web服務(wù)器的對話赘被。否則你就要自己建立server搜創(chuàng)可貼,監(jiān)聽端口肖揣,創(chuàng)建新的流等等一系列復(fù)雜的操作民假。而容器的存在就幫我們封裝這一系列復(fù)雜的操作。使我們能夠?qū)W⒂趕ervlet中的業(yè)務(wù)邏輯的實現(xiàn)龙优。
生命周期管理:容器負(fù)責(zé)servlet的整個生命周期羊异。如何加載類,實例化和初始化servlet彤断,調(diào)用servlet方法野舶,并使servlet實例能夠被垃圾回收。有了容器宰衙,我們就不用花精力去考慮這些資源管理垃圾回收之類的事情平道。
多線程支持:容器會自動為接收的每個servlet請求創(chuàng)建一個新的java線程,servlet運行完之后供炼,容器會自動結(jié)束這個線程巢掺。
聲明式實現(xiàn)安全:利用容器,可以使用xml部署描述文件來配置安全性劲蜻,而不必將其硬編碼到servlet中。
jsp支持:容器將jsp翻譯成java考余!
21先嬉、一個”.java”源文件中是否可以包含多個類(不是內(nèi)部類)?有什么限制
這個是可以的楚堤,一個“.java”源文件里面可以包含多個類疫蔓,但是只允許有一個public類含懊,并且類名必須和文件名一致。
22衅胀、簡單說說你了解的類加載器岔乔。是否實現(xiàn)過類加載器
類加載器(class loader)用來加載 Java 類到 Java 虛擬機中。一般來說滚躯,Java 虛擬機使用 Java 類的方式如下:Java 源程序(.java 文件)在經(jīng)過 Java 編譯器編譯之后就被轉(zhuǎn)換成 Java 字節(jié)代碼(.class 文件)雏门。類加載器負(fù)責(zé)讀取 Java 字節(jié)代碼,并轉(zhuǎn)換成 java.lang.Class類的一個實例掸掏。每個這樣的實例用來表示一個 Java 類茁影。通過此實例的 newInstance()方法就可以創(chuàng)建出該類的一個對象。實際的情況可能更加復(fù)雜丧凤,比如 Java 字節(jié)代碼可能是通過工具動態(tài)生成的募闲,也可能是通過網(wǎng)絡(luò)下載的。類加載器負(fù)責(zé)加載文件系統(tǒng)愿待、網(wǎng)絡(luò)或其他來源的類文件浩螺。有三種默認(rèn)使用的類加載器:Bootstrap類加載器、Extension類加載器和System類加載器(或者叫作Application類加載器)仍侥。每種類加載器都有設(shè)定好從哪里加載類要出。
23、解釋一下什么叫AOP(面向切面編程)
程序在運行時访圃,動態(tài)地將代碼切入到類的指定方法厨幻、指定位置上的編程思想就是面向切面的編程。 一般而言腿时,我們管切入到指定類指定方法的代碼片段稱為切面况脆,而切入到哪些類、哪些方法則叫切入點批糟。有了AOP格了,我們就可以把幾個類共有的代碼,抽取到一個切片中徽鼎,等到需要時再切入對象中去盛末,從而改變其原有的行為。這樣看來否淤,AOP其實只是OOP的補充而已悄但。OOP從橫向上區(qū)分出一個個的類來,而AOP則從縱向上向?qū)ο笾屑尤胩囟ǖ拇a石抡。有了AOP檐嚣,OOP變得立體了。如果加上時間維度啰扛,AOP使OOP由原來的二維變?yōu)槿S了嚎京,由平面變成立體了嗡贺。從技術(shù)上來說,AOP基本上是通過代理機制實現(xiàn)的鞍帝。
24诫睬、請簡述 Servlet 的生命周期及其相關(guān)的方法
- ①實例化階段:服務(wù)器對Servlet進行實例化,調(diào)用Servlet的構(gòu)造方法
- ②初始化階段:服務(wù)器調(diào)用Servlet的init方法進行初始化(只在第一次請求時調(diào)用)帕涌。
- ③請求處理階段:服務(wù)器調(diào)用Servlet的service方法摄凡,然后根據(jù)請求方式調(diào)用相應(yīng)的doXXX方法。
- ④服務(wù)終止階段:服務(wù)器調(diào)用Servlet的destroy方法銷毀Servlet實例
25宵膨、請簡述一下 Ajax 的原理及實現(xiàn)步驟
原理:通過XmlHttpRequest對象來向服務(wù)器發(fā)起異步請求架谎,從服務(wù)器獲得數(shù)據(jù),然后用js來操作dom從而更新頁面辟躏。
- 創(chuàng)建一個XMLHttpRequest對象
- 調(diào)用該對象的open方法
- 如果是post請求谷扣,則調(diào)用
setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”); - 設(shè)置回調(diào)函數(shù)onreadystatechange = callback
- Send
26、簡單描述Struts的主要功能
1.獲取表單內(nèi)容,并組織生成參數(shù)對象
2.根據(jù)請求的參數(shù)轉(zhuǎn)發(fā)請求給適當(dāng)?shù)目刂破?br>
3.在控制器中調(diào)用業(yè)務(wù)接口
4.將業(yè)務(wù)接口返回的結(jié)果包裝起來發(fā)送給指定的視圖,并由視圖完成處理結(jié)果的展現(xiàn)
5.做一些簡單的校驗或是國際化工作
27捎琐、什么是 N 層架構(gòu)
28会涎、什么是CORBA?用途是什么
29瑞凑、什么是Java虛擬機末秃?為什么Java被稱作是“平臺無關(guān)的編程語言”
Java虛擬機是一個可以執(zhí)行Java字節(jié)碼的虛擬機進程。Java源文件被編譯成能被Java虛擬機執(zhí)行的字節(jié)碼文件籽御。
Java是平臺無關(guān)的語言是指用Java寫的應(yīng)用程序不用修改就可在不同的軟硬件平臺上運行练慕。平臺無關(guān)有兩種:源代碼級和目標(biāo)代碼級。C和C++具有一定程度的源代碼級平臺無關(guān)技掏,表明用C或C++寫的應(yīng)用程序不用修改只需重新編譯就可以在不同平臺上運行铃将。
Java主要靠Java虛擬機(JVM)在目標(biāo)碼級實現(xiàn)平臺無關(guān)性。JVM是一種抽象機器哑梳,它附著在具體操作系統(tǒng)之上劲阎,本身具有一套虛機器指令,并有自己的棧鸠真、寄存器組等悯仙。但JVM通常是在軟件上而不是在硬件上實現(xiàn)。(目前吠卷,SUN系統(tǒng)公司已經(jīng)設(shè)計實現(xiàn)了Java芯片锡垄,主要使用在網(wǎng)絡(luò)計算機NC上。另外祭隔,Java芯片的出現(xiàn)也會使Java更容易嵌入到家用電器中偎捎。)JVM是Java平臺無關(guān)的基礎(chǔ),在JVM上,有一個Java解釋器用來解釋Java編譯器編譯后的程序茴她。Java編程人員在編寫完軟件后,通過Java編譯器將Java源程序編譯為JVM的字節(jié)代碼程奠。任何一臺機器只要配備了Java解釋器丈牢,就可以運行這個程序,而不管這種字節(jié)碼是在何種平臺上生成的瞄沙。另外己沛,Java采用的是基于IEEE標(biāo)準(zhǔn)的數(shù)據(jù)類型。通過JVM保證數(shù)據(jù)類型的一致性距境,也確保了Java的平臺無關(guān)性申尼。
30、什么是正則表達式垫桂?用途是什么师幕?哪個包使用正則表達式來實現(xiàn)模式匹配
正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串诬滩、將匹配的子串替換或者從某個串中取出符合某個條件的子串等霹粥。
java.util.regex是一個用正則表達式所訂制的模式來對字符串進行匹配工作的類庫包。它包括兩個類:Pattern和Matcher Pattern 一個Pattern是一個正則表達式經(jīng)編譯后的表現(xiàn)模式疼鸟。 Matcher 一個Matcher對象是一個狀態(tài)機器后控,它依據(jù)Pattern對象做為匹配模式對字符串展開匹配檢查。 首先一個Pattern實例訂制了一個所用語法與PERL的類似的正則表達式經(jīng)編譯后的模式空镜,然后一個Matcher實例在這個給定的Pattern實例的模式控制下進行字符串的匹配工作浩淘。
31、什么是懶加載(Lazy Loading)
延遲加載,顧名思義在需要的時候才加載,這樣做效率會比較低,但是占用內(nèi)存低.內(nèi)存資源有限,如果程序啟動使用一次性加載的方式可能會耗盡內(nèi)存,這時可以使用懶加載,先判斷是否有,沒有再去創(chuàng)建
32吴攒、什么是尾遞歸张抄,為什么需要尾遞歸
如果一個函數(shù)中所有遞歸形式的調(diào)用都出現(xiàn)在函數(shù)的末尾,我們稱這個遞歸函數(shù)是尾遞歸的舶斧。(當(dāng)遞歸調(diào)用是整個函數(shù)體中最后執(zhí)行的語句且它的返回值不屬于表達式的一部分時欣鳖,這個遞歸調(diào)用就是尾遞歸。)尾遞歸函數(shù)的特點是在回歸過程中不用做任何操作茴厉,這個特性很重要泽台,因為大多數(shù)現(xiàn)代的編譯器會利用這種特點自動生成優(yōu)化的代碼。
與普通遞歸相比矾缓,由于尾遞歸的調(diào)用處于方法的最后怀酷,因此方法之前所積累下的各種狀態(tài)對于遞歸調(diào)用結(jié)果已經(jīng)沒有任何意義,因此完全可以把本次方法中留在堆棧中的數(shù)據(jù)完全清除嗜闻,把空間讓給最后的遞歸調(diào)用蜕依。這樣的優(yōu)化便使得遞歸不會在調(diào)用堆棧上產(chǎn)生堆積,意味著即時是“無限”遞歸也不會讓堆棧溢出。這便是尾遞歸的優(yōu)勢样眠。
33友瘤、什么是控制反轉(zhuǎn)(Inversion of Control)與依賴注入(Dependency Injection)
IOC前面已經(jīng)有。補充:依賴注入(Dependency Injection)是控制反轉(zhuǎn)的一種實現(xiàn)方法檐束。James Shore給出了依賴注入的定義:依賴注入就是將實例變量傳入到一個對象中去(Dependency injection means giving an object its instance variables)辫秧。
Spring的核心就是依賴注入。Spring支持的注入方式主要有兩種:setter注入(setter injection)和構(gòu)造器注入(constructor injection)被丧。