版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
java面試總結(jié)報告
多線程、并發(fā)及線程的根底問題:
1)Java中能創(chuàng)立volatile數(shù)組嗎?
能,Java中可以創(chuàng)立volatile類型數(shù)組,不過只是一個指向數(shù)組的引用,而不是整個數(shù)組。我的意思是,假如轉(zhuǎn)變引用指向的數(shù)組,將會受到volatile的愛護(hù),但是假如多個線程同時轉(zhuǎn)變數(shù)組的元素,volatile標(biāo)示符就不能起到之前的愛護(hù)作用了。
2)volatile能使得一個非原子操作變成原子操作嗎?
一個典型的例子是在類中有一個long類型的成員變量。假如你知道該成員變量會被多個線程訪問,如計數(shù)器、價格等,你最好是將其設(shè)置為volatile。為什么?由于Java中讀取long類型變量不是原子的,需要分成兩步,假如一個線程正在修改該long變量的值,另一個線程可能只能看到該值的一半(前32位)。但是對一個volatile型的long或double變量的讀寫是原子。
3)volatile修飾符的有過什么實踐?
一種實踐是用volatile修飾long和double變量,使其能按原子類型來讀寫。double和long都是64位寬,因此對這兩種類型的讀是分為兩局部的,第一次讀取第一個32位,然后再讀剩下的32位,這個過程不是原子的,但Java中volatile型的long或double變量的讀寫是原子的。volatile修復(fù)符的另一個作用是供應(yīng)內(nèi)存屏障(memorybarrier),例如在分布式框架中的應(yīng)用。簡潔的說,就是當(dāng)你寫一個volatile變量之前,Java內(nèi)存模型會插入一個寫屏障(writebarrier),讀一個volatile變量之前,會插入一個讀屏障(readbarrier)。意思就是說,在你寫一個volatile域時,能保證任何線程都能看到你寫的值,同時,在寫之前,也能保證任何數(shù)值的更新對全部線程是可見的,由于內(nèi)存屏障會將其他全部寫的值更新到緩存。
4)volatile類型變量供應(yīng)什么保證?
volatile變量供應(yīng)挨次和可見性保證,例如,JVM或者JIT為了獲得更好的性能會對語句重排序,但是volatile類型變量即使在沒有同步塊的狀況下賦值也不會與其他語句重排序。volatile供應(yīng)happens-before的保證,確保一個線程的修改能對其他線程是可見的。某些狀況下,volatile還能供應(yīng)原子性,如讀64位數(shù)據(jù)類型,像long和double都不是原子的,但volatile類型的double和long就是原子的。
5)你是如何調(diào)用wait()方法的?使用if塊還是循環(huán)?為什么?
wait()方法應(yīng)當(dāng)在循環(huán)調(diào)用,由于當(dāng)線程獵取到CPU開頭執(zhí)行的時候,其他條件可能還沒有滿意,所以在處理前,循環(huán)檢測條件是否滿意會更好。下面是一段標(biāo)準(zhǔn)的使用wait和notify方法的代碼:
//Thestandardidiomforusingthewaitmethod
synchronized(obj){
while(conditiondoesnothold)
obj.wait();//(Releaseslock,andreacquiresonwakeup)
...//Performactionappropriatetocondition}
6)什么是多線程環(huán)境下的偽共享(falsesharing)?
偽共享是多線程系統(tǒng)(每個處理器有自己的局部緩存)中一個眾所周知的性能問題。偽共享發(fā)生在不同處理器的上的線程對變量的修改依靠于一樣的緩存行,如下列圖所示:
7)什么是Busyspin?我們?yōu)槭裁匆褂盟?
Busyspin是一種在不釋放CPU的根底上等待大事的技術(shù)。它常常用于避開喪失CPU緩存中的數(shù)據(jù)(假如線程先暫停,之后在其他CPU上運行就會喪失)。所以,假如你的工作要求低延遲,并且你的線程目前沒有任何挨次,這樣你就可以通過循環(huán)檢測隊列中的新消息來代替調(diào)用sleep()或wait()方法。它唯一的好處就是你只需等待很短的時間,如幾微秒或幾納秒。LMAX分布式框架是一個高性能線程間通信的庫,該庫有一個BusySpinWaitStrategy類就是基于這個概念實現(xiàn)的,使用busyspin循環(huán)EventProcessors等待屏障。
8)什么是線程局部變量?
線程局部變量是局限于線程內(nèi)部的變量,屬于線程自身全部,不在多個線程間共享。Java供應(yīng)ThreadLocal類來支持線程局部變量,是一種實現(xiàn)線程安全的方式。但是在治理環(huán)境下(如web效勞器)使用線程局部變量的時候要特殊當(dāng)心,在這種狀況下,工作線程的生命周期比任何應(yīng)用變量的生命周期都要長。任何線程局部變量一旦在工作完成后沒有釋放,Java應(yīng)用就存在內(nèi)存泄露的風(fēng)險。
9)Java中sleep方法和wait方法的區(qū)分?
雖然兩者都是用來暫停當(dāng)前運行的線程,但是sleep()實際上只是短暫停頓,由于它不會釋放鎖,而wait()意味著條件等待,這就是為什么該方法要釋放鎖,由于只有這樣,其他等待的線程才能在滿意條件時獵取到該鎖。
10)什么是不行變對象(immutableobject)?Java中怎么創(chuàng)立一個不行變對象?
不行變對象指對象一旦被創(chuàng)立,狀態(tài)就不能再轉(zhuǎn)變。任何修改都會創(chuàng)立一個新的對象,如String、Integer及其它包裝類。
11)我們能創(chuàng)立一個包含可變對象的不行變對象嗎?
是的,我們是可以創(chuàng)立一個包含可變對象的不行變對象的,你只需要慎重一點,不要共享可變對象的引用就可以了,假如需要變化時,就返回原對象的一個拷貝。最常見的例子就是對象中包含一個日期對象的引用。
數(shù)據(jù)類型和Java根底面試問題
12)Java中應(yīng)當(dāng)使用什么數(shù)據(jù)類型來代表價格?
假如不是特殊關(guān)懷內(nèi)存和性能的話,使用BigDecimal,否則使用預(yù)定義精度的double類型。
13)怎么將byte轉(zhuǎn)換為String?
可以使用String接收byte[]參數(shù)的構(gòu)造器來進(jìn)展轉(zhuǎn)換,需要留意的點是要使用的正確的編碼,否則會使用平臺默認(rèn)編碼,這個編碼可能跟原來的編碼一樣,也可能不同。
14)我們能將int強制轉(zhuǎn)換為byte類型的變量嗎?假如該值大于byte類型的范圍,將會消失什么現(xiàn)象?
是的,我們可以做強制轉(zhuǎn)換,但是Java中int是32位的,而byte是8位的,所以,假如強制轉(zhuǎn)化是,int類型的高24位將會被丟棄,byte類型的范圍是從-128到128。
15)Java中++操作符是線程安全的嗎?
不是線程安全的操作。它涉及到多個指令,如讀取變量值,增加,然后存儲回內(nèi)存,這個過程可能會消失多個線程交差。
16)a=a+b與a+=b的區(qū)分?
+=隱式的將加操作的結(jié)果類型強制轉(zhuǎn)換為持有結(jié)果的類型。假如兩這個整型相加,如byte、short或者int,首先會將它們提升到int類型,然后在執(zhí)行加法操作。假如加法操作的結(jié)果比a的最大值要大,則a+b會消失編譯錯誤,但是a+=b沒問題,如下:
bytea=127;
byteb=127;
b=a+b;//error:cannotconvertfrominttobyte
b+=a;//ok
注:其實無論a+b的值為多少,編譯器都會報錯,由于a+b操作會將a、b提升為int類型,所以將int類型賦值給byte就會編譯出錯
17)我能在不進(jìn)展強制轉(zhuǎn)換的狀況下將一個double值賦值給long類型的變量嗎?
不行,你不能在沒有強制類型轉(zhuǎn)換的前提下將一個double值賦值給long類型的變量,由于double類型的范圍比long類型更廣,所以必需要進(jìn)展強制轉(zhuǎn)換。
18)3*0.1==0.3將會返回什么?true還是false?
false,由于有些浮點數(shù)不能完全準(zhǔn)確的表示出來。
19)int和Integer哪個會占用更多的內(nèi)存?
Integer對象會占用更多的內(nèi)存。Integer是一個對象,需要存儲對象的元數(shù)據(jù)。但是int是一個原始類型的數(shù)據(jù),所以占用的空間更少。
20)為什么Java中的String是不行變的(Immutable)?
Java中的String不行變是由于Java的設(shè)計者認(rèn)為字符串使用特別頻繁,將字符串設(shè)置為不行變可以允很多個客戶端之間共享一樣的字符串。
21)Java中的構(gòu)造器鏈?zhǔn)鞘裁?
當(dāng)你從一個構(gòu)造器中調(diào)用另一個構(gòu)造器,就是Java中的構(gòu)造器鏈。這種狀況只在重載了類的構(gòu)造器的時候才會消失。
JVM底層與GC(GarbageCollection)的面試問題
22)64位JVM中,int的長度是多數(shù)?
Java中,int類型變量的長度是一個固定值,與平臺無關(guān),都是32位。意思就是說,在32位和64位的Java虛擬機中,int類型的長度是一樣的。
23)Serial與ParallelGC之間的不同之處?
Serial與Parallel在GC執(zhí)行的時候都會引起stop-the-world。它們之間主要不同serial收集器是默認(rèn)的復(fù)制收集器,執(zhí)行GC的時候只有一個線程,而parallel收集器使用多個GC線程來執(zhí)行。
24)32位和64位的JVM,int類型變量的長度是多數(shù)?
32位和64位的JVM中,int類型變量的長度是一樣的,都是32位或者4個字節(jié)。
25)Java中WeakReference與SoftReference的區(qū)分?
雖然WeakReference與SoftReference都有利于提高GC和內(nèi)存的效率,但是WeakReference,一旦失去最終一個強引用,就會被GC回收,而軟引用雖然不能阻擋被回收,但是可以延遲到JVM內(nèi)存缺乏的時候。
26)WeakHashMap是怎么工作的?
WeakHashMap的工作與正常的HashMap類似,但是使用弱引用作為key,意思就是當(dāng)key對象沒有任何引用時,key/value將會被回收。
27)JVM選項-XX:+UseCompressedOops有什么作用?為什么要使用?
當(dāng)你將你的應(yīng)用從32位的JVM遷移到64位的JVM時,由于對象的指針從32位增加到了64位,因此堆內(nèi)存會突然增加,差不多要翻倍。這也會對CPU緩存(容量比內(nèi)存小許多)的數(shù)據(jù)產(chǎn)生不利的影響。由于,遷移到64位的JVM主要動機在于可以指定最大堆大小,通過壓縮OOP可以節(jié)約肯定的內(nèi)存。通過-XX:+UseCompressedOops選項,JVM會使用32位的OOP,而不是64位的OOP。
28)怎樣通過Java程序來推斷JVM是32位還是64位?
你可以檢查某些系統(tǒng)屬性如sun.arch.data.model或os.arch來獵取該信息。
29)32位JVM和64位JVM的最大堆內(nèi)存分別是多數(shù)?
理論上說上32位的JVM堆內(nèi)存可以到達(dá)2^32,即4GB,但實際上會比這個小許多。不同操作系統(tǒng)之間不同,如Windows系統(tǒng)大約1.5GB,Solaris大約3GB。64位JVM允許指定最大的堆內(nèi)存,理論上可以到達(dá)2^64,這是一個特別大的數(shù)字,實際上你可以指定堆內(nèi)存大小到100GB。甚至有的JVM,如Azul,堆內(nèi)存到1000G都是可能的。
30)JRE、JDK、JVM及JIT之間有什么不同?
JRE代表Java運行時(Javarun-time),是運行Java引用所必需的。JDK代表Java開發(fā)工具(Javadevelopmentkit),是Java程序的開發(fā)工具,如Java編譯器,它也包含JRE。JVM代表Java虛擬機(Javavirtualmachine),它的責(zé)任是運行Java應(yīng)用。JIT代表即時編譯(JustInTimecompilation),當(dāng)代碼執(zhí)行的次數(shù)超過肯定的閾值時,會將Java字節(jié)碼轉(zhuǎn)換為本地代碼,如,主要的熱點代碼會被準(zhǔn)換為本地代碼,這樣有利大幅度提高Java應(yīng)用的性能。
31)解釋Java堆空間及GC?
當(dāng)通過Java命令啟動Java進(jìn)程的時候,會為它安排內(nèi)存。內(nèi)存的一局部用于創(chuàng)立堆空間,當(dāng)程序中創(chuàng)立對象的時候,就從對空間中安排內(nèi)存。GC是JVM內(nèi)部的一個進(jìn)程,回收無效對象的內(nèi)存用于將來的安排。
32)你能保證GC執(zhí)行嗎?
不能,雖然你可以調(diào)用System.gc()或者Runtime.gc(),但是沒有方法保證GC的執(zhí)行。
33)怎么獵取Java程序使用的內(nèi)存?堆使用的百分比?
可以通過java.lang.Runtime類中與內(nèi)存相關(guān)方法來獵取剩余的內(nèi)存,總內(nèi)存及最大堆內(nèi)存。通過這些方法你也可以獵取到堆使用的百分比及堆內(nèi)存的剩余空間。Runtime.freeMemory()方法返回剩余空間的字節(jié)數(shù),Runtime.totalMemory()方法總內(nèi)存的字節(jié)數(shù),Runtime.maxMemory()返回最大內(nèi)存的字節(jié)數(shù)。
34)Java中堆和棧有什么區(qū)分?
JVM中堆和棧屬于不同的內(nèi)存區(qū)域,使用目的也不同。棧常用于保存方法幀和局部變量,而對象總是在堆上安排。棧通常都比堆小,也不會在多個線程之間共享,而堆被整個JVM的全部線程共享。
Java根本概念面試題
35)“a==b”和”a.equals(b)”有什么區(qū)分?
假如a和b都是對象,則a==b是比擬兩個對象的引用,只有當(dāng)a和b指向的是堆中的同一個對象才會返回true,而a.equals(b)是進(jìn)展規(guī)律比擬,所以通常需要重寫該方法來供應(yīng)規(guī)律全都性的比擬。例如,String類重寫equals()方法,所以可以用于兩個不同對象,但是包含的字母一樣的”比擬。
36)a.hashCode()有什么用?與a.equals(b)有什么關(guān)系?
hashCode()方法是相應(yīng)對象整型的hash值。它常用于基于hash的集合類,如Hashtable、HashMap、LinkedHashMap等等。它與equals()方法關(guān)系特殊嚴(yán)密。依據(jù)Java標(biāo)準(zhǔn),兩個使用equal()方法來推斷相等的對象,必需具有一樣的hashcode。
37)final、finalize和finally的不同之處?
final是一個修飾符,可以修飾變量、方法和類。假如final修飾變量,意味著該變量的值在初始化后不能被轉(zhuǎn)變。finalize方法是在對象被回收之前調(diào)用的方法,給對象自己最終一個復(fù)活的時機,但是什么時候調(diào)用finalize沒有保證。finally是一個關(guān)鍵字,與try和catch一起用于特別的處理。finally塊肯定會被執(zhí)行,無論在try塊中是否有發(fā)生特別。
38)Java中的編譯期常量是什么?使用它又什么風(fēng)險?
公共靜態(tài)不行變(publicstaticfinal)變量也就是我們所說的編譯期常量,這里的public可選的。實際上這些變量在編譯時會被替換掉,由于編譯器知道這些變量的值,并且知道這些變量在運行時不能轉(zhuǎn)變。這種方式存在的一個問題是你使用了一個內(nèi)部的或第三方庫中的公有編譯時常量,但是這個值后面被其他人轉(zhuǎn)變了,但是你的客戶端仍舊在使用老的值,甚至你已經(jīng)部署了一個新的jar。為了避開這種狀況,當(dāng)你在更新依靠JAR文件時,確保重新編譯你的程序。
Java集合框架的面試題
39)List、Set、Map和Queue之間的區(qū)分?
List是一個有序集合,允許元素重復(fù)。它的某些實現(xiàn)可以供應(yīng)基于下標(biāo)值的常量訪問時間,但是這不是List接口保證的。Set是一個無序集合。
40)poll()方法和remove()方法的區(qū)分?
poll()和remove()都是從隊列中取出一個元素,但是poll()在獵取元素失敗的時候會返回空,但是remove()失敗的時候會拋出特別。
41)Java中LinkedHashMap和PriorityQueue的區(qū)分是什么?
PriorityQueue保證最高或者最低優(yōu)先級的的元素總是在隊列頭部,但是LinkedHashMap維持的挨次是元素插入的挨次。當(dāng)遍歷一個PriorityQueue時,沒有任何挨次保證,但是LinkedHashMap課保證遍歷挨次是元素插入的挨次。
42)ArrayList與LinkedList的不區(qū)分?
最明顯的區(qū)分是ArrrayList底層的數(shù)據(jù)構(gòu)造是數(shù)組,支持隨機訪問,而LinkedList的底層數(shù)據(jù)構(gòu)造書鏈表,不支持隨機訪問。使用下標(biāo)訪問一個元素,ArrayList的時間簡單度是O(1),而LinkedList是O(n)。
43)用哪兩種方式來實現(xiàn)集合的排序?
你可以使用有序集合,如TreeSet或TreeMap,你也可以使用有挨次的的集合,如list,然后通過Collections.sort()來排序。
44)Java中怎么打印數(shù)組?
你可以使用Arrays.toString()和Arrays.deepToString()方法來打印數(shù)組。由于數(shù)組沒有實現(xiàn)toString()方法,所以假如將數(shù)組傳遞給System.out.println()方法,將無法打印出數(shù)組的內(nèi)容,但是Arrays.toString()可以打印每個元素。
45)Hashtable與HashMap有什么不同之處?
這兩個類有很多不同的地方,下面列出了一局部:
a)Hashtable是JDK1遺留下來的類,而HashMap是后來增加的。
b)Hashtable是同步的,比擬慢,但HashMap沒有同步策略,所以會更快。
c)Hashtable不允許有個空的key,但是HashMap允許消失一個nullkey。
46)Java中的HashSet,內(nèi)部是如何工作的?
HashSet的內(nèi)部采納HashMap來實現(xiàn)。由于Map需要key和value,所以全部key的都有一個默認(rèn)value。類似于HashMap,HashSet不允許重復(fù)的key,只允許有一個nullkey,意思就是HashSet中只允許存儲一個null對象。
47)寫一段代碼在遍歷ArrayList時移除一個元素?
該問題的關(guān)鍵在于面試者使用的是ArrayList的remove()還是Iterator的remove()方法。這有一段例如代碼,是使用正確的方式來實現(xiàn)在遍歷的過程中移除元素,而不會消失ConcurrentModificationException特別的例如代碼。
48)我們能自己寫一個容器類,然后使用for-each循環(huán)碼?
可以,你可以寫一個自己的容器類。假如你想使用Java中增加的循環(huán)來遍歷,你只需要實現(xiàn)Iterable接口。假如你實現(xiàn)Collection接口,默認(rèn)就具有該屬性。
49)ArrayList和HashMap的默認(rèn)大小是多數(shù)?
在Java7中,ArrayList的默認(rèn)大小是10個元素,HashMap的默認(rèn)大小是16個元素(必需是2的冪)。這就是Java7中ArrayList和HashMap類的代碼片段:
//fromArrayList.javaJDK1.7
privatestaticfinalintDEFAULT_CAPACITY=10;
//fromHashMap.javaJDK7
staticfinalintDEFAULT_INITIAL_CAPACITY=14;//aka16
50)有沒有可能兩個不相等的對象有有一樣的hashcode?
有可能,兩個不相等的對象可能會有一樣的hashcode值,這就是為什么在hashmap中會有沖突。相等hashcode值的規(guī)定只是說假如兩個對象相等,必需有一樣的hashcode值,但是沒有關(guān)于不相等對象的任何規(guī)定。
51)兩個一樣的對象會有不同的的hashcode嗎?
不能,依據(jù)hashcode的規(guī)定,這是不行能的。
52)我們可以在hashcode()中使用隨機數(shù)字嗎?
不行,由于對象的hashcode值必需是一樣的。參見答案獵取更多關(guān)于Java中重寫hashCode()方法的學(xué)問。
53)Java中,Comparator與Comparable有什么不同?
Comparable接口用于定義對象的自然挨次,而comparator通常用于定義用戶定制的挨次。Comparable總是只有一個,但是可以有多個comparator來定義對象的挨次。
54)為什么在重寫equals方法的時候需要重寫hashCode方法?
由于有強制的標(biāo)準(zhǔn)指定需要同時重寫hashcode與equal是方法,很多容器類,如HashMap、HashSet都依靠于hashcode與equals的規(guī)定。
Java最正確實踐的面試問題
55)Java中,編寫多線程程序的時候你會遵循哪些最正確實踐?
a)給線程命名,這樣可以幫忙調(diào)試。
b)最小化同步的范圍,而不是將整個方法同步,只對關(guān)鍵局部做同步。
c)假如可以,更偏向于使用volatile而不是synchronized。
d)使用更高層次的并發(fā)工具,而不是使用wait()和notify()來實現(xiàn)線程間通信,如BlockingQueue,CountDownLatch及Semeaphore。
e)優(yōu)先使用并發(fā)集合,而不是對集合進(jìn)展同步。并發(fā)集合供應(yīng)更好的可擴展性。
56)說出幾點Java中使用Collections的最正確實踐?
a)使用正確的集合類,例如,假如不需要同步列表,使用ArrayList而不是Vector。
b)優(yōu)先使用并發(fā)集合,而不是對集合進(jìn)展同步。并發(fā)集合供應(yīng)更好的可擴展性。
c)使用接口代表和訪問集合,如使用List存儲ArrayList,使用Map存儲HashMap等等。
d)使用迭代器來循環(huán)集合。
e)使用集合的時候使用泛型。
57)說出在Java中使用線程的最正確實踐?
a)對線程命名
b)將線程和任務(wù)分別,使用線程池執(zhí)行器來執(zhí)行Runnable或Callable。
c)使用線程池
58)說出IO的最正確實踐?
a)使用有緩沖區(qū)的IO類,而不要單獨讀取字節(jié)或字符。
b)使用NIO和NIO2
c)在finally塊中關(guān)閉流,或者使用try-with-resource語句。
d)使用內(nèi)存映射文件獵取更快的IO。
59)列出應(yīng)當(dāng)遵循的JDBC最正確實踐?
a)使用批量的操作來插入和更新數(shù)據(jù)
b)使用PreparedStatement來避開SQL特別,并提高性能。
c)使用數(shù)據(jù)庫連接池
d)通過列名來獵取結(jié)果集,不要使用列的下標(biāo)來獵取。
60)說出幾條Java中方法重載的最正確實踐?
a)不要重載這樣的方法:一個方法接收int參數(shù),而另個方法接收Integer參數(shù)。
b)不要重載參數(shù)數(shù)量全都,而只是參數(shù)挨次不同的方法。
c)假如重載的方法參數(shù)個數(shù)多于5個,采納可變參數(shù)。
Date、Time及Calendar的面試題
61)在多線程環(huán)境下,SimpleDateFormat是線程安全的嗎?
不是,特別不幸,DateFormat的全部實現(xiàn),包括SimpleDateFormat都不是線程安全的,因此你不應(yīng)當(dāng)在多線程序中使用,除非是在對外線程安全的環(huán)境中使用,如將SimpleDateFormat限制在ThreadLocal中。假如你不這么做,在解析或者格式化日期的時候,可能會獵取到一個不正確的結(jié)果。因此,從日期、時間處理的全部實踐來說,我強力推舉joda-time庫。
62)Java中如何格式化一個日期?如格式化為ddMMyyyy的形式?
Java中,可以使用SimpleDateFormat類或者joda-time庫來格式日期。DateFormat類允許你使用多種流行的格式來格式化日期。參見答案中的例如代碼,代碼中演示了將日期格式化成不同的格式,如dd-MM-yyyy或ddMMyyyy。
關(guān)于OOP和設(shè)計模式的面試題
63)接口是什么?為什么要使用接口而不是直接使用詳細(xì)類?
接口用于定義API。它定義了類必需得遵循的規(guī)章。同時,它供應(yīng)了一種抽象,由于客戶端只使用接口,這樣可以有多重實現(xiàn),如List接口,你可以使用可隨機訪問的ArrayList,也可以使用便利插入和刪除的LinkedList。接口中不允許寫代碼,以此來保證抽象,但是Java8中你可以在接口聲明靜態(tài)的默認(rèn)方法,這種方法是詳細(xì)的。
64)Java中,抽象類與接口之間有什么不同?
Java中,抽象類和接口有許多不同之處,但是最重要的一個是Java中限制一個類只能繼承一個類,但是可以實現(xiàn)多個接口。抽象類可以很好的定義一個家族類的默認(rèn)行為,而接口能更好的定義類型,有助于后面實現(xiàn)多態(tài)機制。關(guān)于這個問題的爭論請查看答案。
65)除了單例模式,你在生產(chǎn)環(huán)境中還用過什么設(shè)計模式?
這需要依據(jù)你的閱歷來答復(fù)。一般狀況下,你可以說依靠注入,工廠模式,裝飾模式或者觀看者模式,隨便選擇你使用過的一種即可。不過你要預(yù)備答復(fù)接下的基于你選擇的模式的問題。
66)適配器模式是什么?什么時候使用?
適配器模式供應(yīng)對接口的轉(zhuǎn)換。假如你的客戶端使用某些接口,但是你有另外一些接口,你就可以寫一個適配去來連接這些接口。
67)構(gòu)造器注入和setter依靠注入,那種方式更好?
每種方式都有它的缺點和優(yōu)點。構(gòu)造器注入保證全部的注入都被初始化,但是setter注入供應(yīng)更好的敏捷性來設(shè)置可選依靠。假如使用XML來描述依靠,Setter注入的可讀寫會更強。閱歷法則是強制依靠使用構(gòu)造器注入,可選依靠使用setter注入。
68)依靠注入和工程模式之間有什么不同?
雖然兩種模式都是將對象的創(chuàng)立從應(yīng)用的規(guī)律中分別,但是依靠注入比工程模式更清楚。通過依靠注入,你的類就是POJO,它只知道依靠而不關(guān)懷它們怎么獵取。使用工廠模式,你的類需要通過工廠來獵取依靠。因此,使用DI會比使用工廠模式更簡單測試。
69)適配器模式和裝飾器模式有什么區(qū)分?
雖然適配器模式和裝飾器模式的構(gòu)造類似,但是每種模式的消失意圖不同。適配器模式被用于橋接兩個接口,而裝飾模式的目的是在不修改類的狀況下給類增加新的功能。
70)適配器
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度特色餐廳租賃合同范本6篇
- 二零二五年度智能家居設(shè)備定制研發(fā)合同4篇
- 二零二五年度網(wǎng)絡(luò)安全風(fēng)險評估與整改服務(wù)合同范本3篇
- 二零二五年度遮陽棚安裝與建筑節(jié)能減排合同范文2篇
- 2025年消防系統(tǒng)遠(yuǎn)程監(jiān)控與報警服務(wù)合同6篇
- 二零二五年鋼結(jié)構(gòu)建筑施工企業(yè)質(zhì)量認(rèn)證合同3篇
- 二零二五年度高檔住宅區(qū)社區(qū)綠化工程設(shè)計與委托管理合同3篇
- 二零二四停車場智能停車管理系統(tǒng)升級合同3篇
- 2025年生態(tài)旅游區(qū)綠植景觀設(shè)計與施工服務(wù)合同范本4篇
- 2025年度貓咪寵物科普教育與培訓(xùn)合同4篇
- 單級倒立擺系統(tǒng)建模與控制器設(shè)計
- 齲病的治療 深齲的治療
- GB/T 35005-2018集成電路倒裝焊試驗方法
- 投標(biāo)報價明顯低于采購預(yù)算價說明函
- 福建師范大學(xué)(答案)課程考試2023年2月《刑事訴訟法》作業(yè)考核試題
- 寫人事物景作文課件
- 廠級安全培訓(xùn)資料
- 中國藥科大學(xué)《藥物化學(xué)》教學(xué)日歷
- 露天礦山課件
- 經(jīng)濟效益證明(模板)
- 銀行卡凍結(jié)怎么寫申請書
評論
0/150
提交評論