版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
2023年java面試題大全(整理版)1、面向對象的特征有哪些方面?-抽象:抽象是將一類對象的共同特征總結出來構造類的過程,包括數據抽象和行為抽象兩方面。抽象只關注對象有哪些屬性和行為,并不關注這些行為的細節是什么。-繼承:繼承是從已有類得到繼承信息創建新類的過程。提供繼承的類叫父類(超類、基類)、得到繼承的類叫子類(派生類)。-封裝:通常認為封裝是把數據和操作數據的方法綁定起來,對數據的訪問只能通過已定義的接口。可以說,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的編程接口(可以想想普通洗衣機和全自動洗衣機的差別,明顯全自動洗衣機封裝更好因此操作起來更簡單;我們現在使用的智能也是封裝得足夠好的,因為幾個按鍵就搞定了所有的事情)。-多態性:多態性是指允許不同子類型的對象對同一消息作出不同的響應。簡單的說就是用同樣的對象引用調用同樣的方法但是做了不同的事情。實現多態需要做兩件事:1).方法重寫(子類繼承父類并重寫父類中的方法);2).對象造型(用父類型引用引用子類型對象,這樣同樣的引用調用同樣的方法就會根據子類對象的不同而表現出不同的行為)2、訪問修飾符public,private,protected,以及不寫(默認)時的區別?修飾符當前類同
包子
類其他包public√√√√protected√√√×default√√××private√×××3、String是最基本的數據類型嗎?答:不是。Java中的基本數據類型只有8個:byte、short、int、long、float、double、char、boolean;除了基本類型(primitivetype)和枚舉類型(enumerationtype),剩下的都是引用類型(referencetype)。4、floatf=3.4;是否正確?答:不正確。3.4是雙精度數,將雙精度型(double)賦值給浮點型(float)屬于下轉型(down-casting,也稱為窄化)會造成精度損失,因此需要強制類型轉換floatf=(float)3.4;或者寫成floatf=3.4F;。5、shorts1=1;s1=s1+1;有錯嗎?shorts1=1;s1+=1;有錯嗎?答:對于shorts1=1;s1=s1+1;由于1是int類型,因此s1+1運算結果也是int型,需要強制轉換類型才能賦值給short型。而shorts1=1;s1+=1;可以正確編譯,因為s1+=1;相當于s1=(short)(s1+1);其中有隱含的強制類型轉換。6、int和Integer有什么區別?答:Java是一個近乎純潔的面向對象編程語言,但是為了編程的方便還是引入了基本數據類型,但是為了能夠將這些基本數據類型當成對象操作,Java為每一個基本數據類型都引入了對應的包裝類型(wrapperclass),int的包裝類就是Integer,從Java5開始引入了自動裝箱/拆箱機制,使得二者可以相互轉換。classAutoUnboxingTest{publicstaticvoidmain(String[]args){Integera=newInteger(3);Integerb=3;
//將3自動裝箱成Integer類型intc=3;System.out.println(a==b);
//false兩個引用沒有引用同一對象System.out.println(a==c);
//truea自動拆箱成int類型再和c比較}}最近還遇到一個面試題,也是和自動裝箱和拆箱有點關系的,代碼如下所示:publicclassTest03{publicstaticvoidmain(String[]args){Integerf1=100,f2=100,f3=150,f4=150;System.out.println(f1==f2);System.out.println(f3==f4);}}如果不明就里很容易認為兩個輸出要么都是true要么都是false。首先需要注意的是f1、f2、f3、f4四個變量都是Integer對象引用,所以下面的==運算比較的不是值而是引用。裝箱的本質是什么呢?當我們給一個Integer對象賦一個int值的時候,會調用Integer類的靜態方法valueOfpublicstaticIntegervalueOf(inti){if(i>=IntegerCache.low&&i<=IntegerCache.high)returnIntegerCache.cache[i+(-IntegerCache.low)];returnnewInteger(i);}簡單的說,如果整型字面量的值在-128到127之間,那么不會new新的Integer對象,而是直接引用常量池中的Integer對象,所以上面的面試題中f1==f2的結果是true,而f3==f4的結果是false。7、&和&&的區別?雖然二者都要求運算符左右兩端的布爾值都是true整個表達式的值才是true。&&之所以稱為短路運算是因為,如果&&左邊的表達式的值是false,右邊的表達式會被直接短路掉,不會進行運算。很多時候我們可能都需要用&&而不是&,例如在驗證用戶登錄時判定用戶名不是null而且不是空字符串,應當寫為:username!=null&&!username.equals(“”),二者的順序不能交換,更不能用&運算符,因為第一個條件如果不成立,根本不能進行字符串的equals比較,否則會產生NullPointerException異常。注意:邏輯或運算符(|)和短路或運算符(||)的差別也是如此。8、解釋內存中的棧(stack)、堆(heap)和靜態區(staticarea)的用法。棧空間操作起來最快但是棧很小,通常大量的對象都是放在堆空間Stringstr=newString("hello");上面的語句中變量str放在棧上,用new創建出來的字符串對象放在堆上,而”hello”這個字面量放在靜態區。9、Math.round(11.5)等于多少?Math.round(-11.5)等于多少?答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在參數上加0.5然后進行下取整。10、switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?expr可以是byte、short、char、int、enum、String類型,但是long類型不能11、用最有效率的方法計算2乘以8?答:2<<3(左移3位相當于乘以2的3次方,右移3位相當于除以2的3次方)。12、數組有沒有length()方法?String有沒有length()方法?答:數組沒有length()方法,有length的屬性。String有length()方法。JavaScript中,獲得字符串的長度是通過length屬性得到的,這一點容易和Java混淆。13、構造器(constructor)是否可被重寫(override)?答:構造器不能被繼承,因此不能被重寫,但可以被重載。14、兩個對象值相同(x.equals(y)==true),但卻可有不同的hashcode,這句話對不對?答:不對,如果兩個對象x和y滿足x.equals(y)==true,它們的哈希碼(hashcode)應當相同。Java對于eqauls方法和hashCode方法是這樣規定的:(1)如果兩個對象相同(equals方法返回true),那么它們的hashCode值一定要相同;(2)如果兩個對象的hashCode相同,它們并不一定相同15、是否可以繼承String類?答:String類是final類,不可以被繼承。16、當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞?答:是值傳遞。Java語言的方法調用只支持參數的值傳遞。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的屬性可以在被調用過程中被改變,但對對象引用的改變是不會影響到調用者的17、String和StringBuilder、StringBuffer的區別?答:Java平臺提供了兩種類型的字符串:String和StringBuffer/StringBuilder,它們可以儲存和操作字符串。其中String是只讀字符串,也就意味著String引用的字符串內容是不能被改變的。而StringBuffer/StringBuilder類表示的字符串對象可以直接進行修改。StringBuilder是Java5中引入的,它和StringBuffer的方法完全相同,區別在于它是在單線程環境下使用的,因為它的所有方面都沒有被synchronized修飾,因此它的效率也比StringBuffer要高。18、重載(Overload)和重寫(Override)的區別。重載的方法能否根據返回類型進行區分?答:方法的重載和重寫都是實現多態的方式,區別在于前者實現的是編譯時的多態性,而后者實現的是運行時的多態性。重載發生在一個類中,同名的方法如果有不同的參數列表(參數類型不同、參數個數不同或者二者都不同)則視為重載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的返回類型,比父類被重寫方法更好訪問,不能比父類被重寫方法聲明更多的異常(里氏代換原則)。重載對返回類型沒有特殊的要求。19、描述一下JVM加載class文件的原理機制?答:JVM中類的裝載是由類加載器(ClassLoader)和它的子類來實現的,Java中的類加載器是一個重要的Java運行時系統組件,它負責在運行時查找和裝入類文件中的類。類的加載是指把類的.class文件中的數據讀入到內存中,通常是創建一個字節數組讀入.class文件20、抽象類(abstractclass)和接口(interface)有什么異同?答:抽象類和接口都不能夠實例化,但可以定義抽象類和接口類型的引用。一個類如果繼承了某個抽象類或者實現了某個接口都需要對其中的抽象方法全部進行實現,否則該類仍然需要被聲明為抽象類。接口比抽象類更加抽象,因為抽象類中可以定義構造器,可以有抽象方法和具體方法,而接口中不能定義構造器而且其中的方法全部都是抽象方法。抽象類中的成員可以是private、默認、protected、public的,而接口中的成員全都是public的。抽象類中可以定義成員變量,而接口中定義的成員變量實際上都是常量。有抽象方法的類必須被聲明為抽象類,而抽象類未必要有抽象方法。21、Java中會存在內存泄漏嗎,請簡單描述。答:理論上Java因為有垃圾回收機制(GC)不會存在內存泄露問題(這也是Java被廣泛使用于服務器端編程的一個重要原因);然而在實際開發中,可能會存在無用但可達的對象,這些對象不能被GC回收,因此也會導致內存泄露的發生。例如hibernate的Session(一級緩存)中的對象屬于持久態,垃圾回收器是不會回收這些對象的,然而這些對象中可能存在無用的垃圾對象,如果不及時關閉(close)或清空(flush)一級緩存就可能導致內存泄露22、GC是什么?為什么要有GC?答:GC是垃圾收集的意思,垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存23、Strings=newString(“xyz”);創建了幾個字符串對象?答:兩個對象,一個是靜態區的”xyz”,一個是用new創建在堆上的對象。24、接口是否可繼承(extends)接口?抽象類是否可實現(implements)接口?抽象類是否可繼承具體類(concreteclass)?答:接口可以繼承接口,而且支持多重繼承。抽象類可以實現(implements)接口,抽象類可繼承具體類也可以繼承抽象類。25、Java中的final關鍵字有哪些用法?答:(1)修飾類:表示該類不能被繼承;(2)修飾方法:表示方法不能被重寫;(3)修飾變量:表示變量只能一次賦值以后值不能被修改(常量)。26、指出下面程序的運行結果。classA{
static{
System.out.print("1");
}
publicA(){
System.out.print("2");
}}
classBextendsA{
static{
System.out.print("a");
}
publicB(){
System.out.print("b");
}}
publicclassHello{
publicstaticvoidmain(String[]args){
Aab=newB();
ab=newB();
}
}答:執行結果:1a2b2b。創建對象時構造器的調用順序是:先初始化靜態成員,然后調用父類構造器,再初始化非靜態成員,最后調用自身構造器。27、數據類型之間的轉換:-如何將字符串轉換為基本數據類型?-如何將基本數據類型轉換為字符串?答:-調用基本數據類型對應的包裝類中的方法parseXXX(String)或valueOf(String)即可返回相應基本類型;-一種方法是將基本數據類型與空字符串(”")連接(+)即可獲得其所對應的字符串;另一種方法是調用String類中的valueOf()方法返回相應字符串28、如何實現字符串的反轉及替換?答:方法很多,可以自己寫實現也可以使用String或StringBuffer/StringBuilder中的方法。有一道很常見的面試題是用遞歸實現字符串反轉,代碼如下所示:publicstaticStringreverse(StringoriginStr){if(originStr==null||originStr.length()<=1)returnoriginStr;returnreverse(originStr.substring(1))+originStr.charAt(0);}29、怎樣將GB2312編碼的字符串轉換為ISO-8859-1編碼的字符串?答:代碼如下所示:Strings1="你好";Strings2=newString(s1.getBytes("GB2312"),"ISO-8859-1");30、利用java.text.DataFormat的子類(如SimpleDateFormat類)中的format(Date)方法可將日期格式化classDateFormatTest{publicstaticvoidmain(String[]args){SimpleDateFormatoldFormatter=newSimpleDateFormat("yyyy/MM/dd");Datedate1=newDate();System.out.println(oldFormatter.format(date1));}}31、比較一下Java和JavaSciprt。java是靜態語言,js是動態語言-基于對象和面向對象:Java是一種真正的面向對象的語言,即使是開發簡單的程序,必須設計對象;JavaScript是種腳本語言,它可以用來制作與網絡無關的,與用戶交互作用的復雜軟件。它是一種基于對象(Object-Based)和事件驅動(Event-Driven)的編程語言,因而它本身提供了非常豐富的內部對象供設計人員使用。-解釋和編譯:Java的源代碼在執行之前,必須經過編譯。JavaScript是一種解釋性編程語言,其源代碼不需經過編譯,由瀏覽器解釋執行。(目前的瀏覽器幾乎都使用了JIT(即時編譯)技術來提升JavaScript的運行效率)-強類型變量和類型弱變量:Java采用強類型變量檢查,即所有變量在編譯之前必須作聲明;JavaScript中變量是弱類型的,甚至在使用變量前可以不作聲明,JavaScript的解釋器在運行時檢查推斷其數據類型。-代碼格式不一樣。32、try{}里有一個return語句,那么緊跟在這個try后的finally{}里的代碼會不會被執行,什么時候被執行,在return前還是后?答:會執行,在方法返回調用者前執行。在finally中改變返回值的做法是不好的,因為如果存在finally代碼塊,try中的return語句不會立馬返回調用者,而是記錄下返回值待finally代碼塊執行完畢之后再向調用者返回其值,然后如果在finally中修改了返回值,就會返回修改后的值33、列出一些你常見的運行時異常?答:-ArithmeticException(算術異常)-ClassCastException(類轉換異常)-IllegalArgumentException(非法參數異常)-IndexOutOfBoundsException(下標越界異常)-NullPointerException(空指針異常)-SecurityException(安全異常)34、類ExampleA繼承Exception,類ExampleB繼承ExampleA。有如下代碼片斷:try{thrownewExampleB("b")}catch(ExampleAe){System.out.println("ExampleA");}catch(Exceptione){System.out.println("Exception");}請問執行此段代碼的輸出是什么?答:輸出:ExampleA。(根據里氏代換原則[能使用父類型的地方一定能使用子類型],抓取ExampleA類型異常的catch塊能夠抓住try塊中拋出的ExampleB類型的異常)面試題
-說出下面代碼的運行結果。(此題的出處是《Java編程思想》一書)classAnnoyanceextendsException{}classSneezeextendsAnnoyance{}classHuman{publicstaticvoidmain(String[]args)throwsException{try{try{thrownewSneeze();}catch(Annoyancea){System.out.println("CaughtAnnoyance");throwa;}}catch(Sneezes){System.out.println("CaughtSneeze");return;}finally{System.out.println("HelloWorld!");}}}輸出:CaughtAnnoyance
CaughtSneeze
HelloWorld![java]viewplaincopytry
{
thrownew
Annoyance();
}
catch
(Sneeze
s)
{
System.out.println("Caught
Sneeze");
return;
}
finally
{
System.out.println("Hello
World!");
}
輸出:(父類throw出來的異常,子類并沒有捕獲到)HelloWorld!
Exceptioninthread"main"com.xq.exceptions.Annoyance
atcom.xq.exceptions.Human.main(ExceptionTest.java:14)
[java]viewplaincopytry
{
thrownew
Annoyance();
}
catch
(Sneeze
s)
{
System.out.println("Caught
Sneeze");
return;
}
catch
(Exception
e)
{
System.out.println("Caught
Exception");
return;
}
finally
{
System.out.println("Hello
World!");
}
輸出:(既然子類捕獲不了,那就使用Exception),可以看到結果如下:CaughtExceptionHelloWorld!35、List、Set、Map是否繼承自Collection接口?答:List、Set是,Map不是。Map是鍵值對映射容器,與List和Set有明顯的區別,而Set存儲的零散的元素且不允許有重復元素(數學中的集合也是如此),List是線性結構的容器,適用于按數值索引訪問元素的情形。36、Collection和Collections的區別?答:Collection是一個接口,它是Set、List等容器的父接口;Collections是個一個工具類,提供了一系列的靜態方法來輔助容器操作,這些方法包括對容器的搜索、排序、線程安全化等等。37、List、Map、Set三個接口存取元素時,各有什么特點?答:List以特定索引來存取元素,可以有重復元素。Set不能存放重復元素(用對象的equals()方法來區分元素是否重復)。Map保存鍵值對(key-valuepair)映射,映射關系可以是一對一或多對一38、Thread類的sleep()方法和對象的wait()方法都可以讓線程暫停執行,它們有什么區別?答:sleep()方法(休眠)是線程類(Thread)的靜態方法,調用此方法會讓當前線程暫停執行指定的時間,將執行機會(CPU)讓給其他線程,但是對象的鎖依然保持,因此休眠時間結束后會自動恢復。wait()是Object類的方法,調用對象的wait()方法導致當前線程放棄對象的鎖(線程暫停執行),進入對象的等待池(waitpool),只有調用對象的notify()方法(或notifyAll()方法)時才能喚醒等待池中的線程進入等鎖池(lockpool),如果線程重新獲得對象的鎖就可以進入就緒狀態。39、線程的sleep()方法和yield()方法有什么區別?答:①sleep()方法給其他線程運行機會時不考慮線程的優先級,因此會給低優先級的線程以運行的機會;yield()方法只會給相同優先級或更高優先級的線程以運行的機會;②線程執行sleep()方法后轉入阻塞(blocked)狀態,而執行yield()方法后轉入就緒(ready)狀態;③sleep()方法聲明拋出InterruptedException,而yield()方法沒有聲明任何異常;④sleep()方法比yield()方法(跟操作系統CPU調度相關)具有更好的可移植性。40、當一個線程進入一個對象的synchronized方法A之后,其它線程是否可進入此對象的synchronized方法B?答:不能。其它線程只能訪問該對象的非同步方法,同步方法則不能進入。因為非靜態方法上的synchronized修飾符要求執行方法時要獲得對象的鎖,如果已經進入A方法說明對象鎖已經被取走,那么試圖進入B方法的線程就只能在等鎖池(注意不是等待池哦)中等待對象的鎖。41、請說出與線程同步以及線程調度相關的方法。答:-wait():使一個線程處于等待(阻塞)狀態,并且釋放所持有的對象的鎖;-sleep():使一個正在運行的線程處于睡眠狀態,是一個靜態方法,調用此方法要處理InterruptedException異常;-notify():喚醒一個處于等待狀態的線程,當然在調用此方法的時候,并不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且與優先級無關;-notityAll():喚醒所有處于等待狀態的線程,該方法并不是將對象的鎖給所有線程,而是讓它們競爭,只有獲得鎖的線程才能進入就緒狀態;42、編寫多線程程序有幾種實現方式?答:一種是繼承Thread類;另一種是實現Runnable接口。兩種方式都要通過重寫run()方法來定義線程的行為,推薦使用后者,因為Java中的繼承是單繼承,一個類有一個父類,如果繼承了Thread類就無法再繼承其他類了,顯然使用Runnable接口更為靈活。43、synchronized關鍵字的用法?答:synchronized關鍵字可以將對象或者方法標記為同步,以實現對對象和方法的互斥訪問,可以用synchronized(對象){…}定義同步代碼塊,或者在聲明方法時將synchronized作為方法的修飾符。44、舉例說明同步和異步。答:如果系統中存在臨界資源(資源數量少于競爭資源的線程數量的資源),例如正在寫的數據以后可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那么這些數據就必須進行同步存取(數據庫操作中的排他鎖就是最好的例子)。當應用程序在對象上調用了一個需要花費很長時間來執行的方法,并且不希望讓程序等待方法的返回時,就應該使用異步編程,在很多情況下采用異步途徑往往更有效率。事實上,所謂的同步就是指阻塞式操作,而異步就是非阻塞式操作。45、簡述synchronized和java.util.concurrent.locks.Lock的異同?答:Lock是Java5以后引入的新的API,和關鍵字synchronized相比主要相同點:Lock能完成synchronized所實現的所有功能;主要不同點:Lock有比synchronized更精確的線程語義和更好的性能,而且不強制性的要求一定要獲得鎖。synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放,并且最好在finally塊中釋放(這是釋放外部資源的最好的地方)46、事務的ACID是指什么?答:-原子性(Atomic):事務中各項操作,要么全做要么全不做,任何一項操作的失敗都會導致整個事務的失敗;-一致性(Consistent):事務結束后系統狀態是一致的;-隔離性(Isolated):并發執行的事務彼此無法看到對方的中間狀態;-持久性(Durable):事務完成后所做的改動都會被持久化,即使發生災難性的失敗。通過日志和同步備份可以在故障發生后重建數據。47、獲得一個類的類對象有哪些方式?答:-方法1:類型.class,例如:String.class-方法2:對象.getClass(),例如:”hello”.getClass()-方法3:Class.forName(),例如:Class.forName(“java.lang.String”)48、簡述一下面向對象的”六原則一法則”。答:-單一職責原則:一個類只做它該做的事情。(單一職責原則想表達的就是”高內聚”,寫代碼最終極的原則只有六個字”高內聚、低耦合”,就如同葵花寶典或辟邪劍譜的中心思想就八個字”欲練此功必先自宮”,所謂的高內聚就是一個代碼模塊只完成一項功能,在面向對象中,如果只讓一個類完成它該做的事,而不涉及與它無關的領域就是踐行了高內聚的原則,這個類就只有單一職責。我們都知道一句話叫”因為專注,所以專業”,一個對象如果承擔太多的職責,那么注定它什么都做不好。這個世界上任何好的東西都有兩個特征,一個是功能單一,好的相機絕對不是電視購物里面賣的那種一個機器有一百多種功能的,它基本上只能照相;另一個是模塊化,好的自行車是組裝車,從減震叉、剎車到變速器,所有的部件都是可以拆卸和重新組裝的,好的乒乓球拍也不是成品拍,一定是底板和膠皮可以拆分和自行組裝的,一個好的軟件系統,它里面的每個功能模塊也應該是可以輕易的拿到其他系統中使用的,這樣才能實現軟件復用的目標。)-開閉原則:軟件實體應當對擴展開放,對修改關閉。(在理想的狀態下,當我們需要為一個軟件系統增加新功能時,只需要從原來的系統派生出一些新類就可以,不需要修改原來的任何一行代碼。要做到開閉有兩個要點:①抽象是關鍵,一個系統中如果沒有抽象類或接口系統就沒有擴展點;②封裝可變性,將系統中的各種可變因素封裝到一個繼承結構中,如果多個可變因素混雜在一起,系統將變得復雜-依賴倒轉原則:面向接口編程。-
里氏替換原則:任何時候都可以用子類型替換掉父類型。(關于里氏替換原則的描述,BarbaraLiskov女士的描述比這個要復雜得多,但簡單的說就是能用父類型的地方就一定能使用子類型。里氏替換原則可以檢查繼承關系是否合理,如果一個繼承關系違背了里氏替換原則,那么這個繼承關系一定是錯誤的,需要對代碼進行重構。例如讓貓繼承狗,或者狗繼承貓,又或者讓正方形繼承長方形都是錯誤的繼承關系,因為你很容易找到違反里氏替換原則的場景。需要注意的是:子類一定是增加父類的能力而不是減少父類的能力,因為子類比父類的能力更多,把能力多的對象當成能力少的對象來用當然沒有任何問題。)-接口隔離原則:接口要小而專,絕不能大而全。(臃腫的接口是對接口的污染,既然接口表示能力,那么一個接口只應該描述一種能力,接口也應該是高度內聚的。例如,琴棋書畫就應該分別設計為四個接口,而不應設計成一個接口中的四個方法,因為如果設計成一個接口中的四個方法,那么這個接口很難用,畢竟琴棋書畫四樣都精通的人還是少數,而如果設計成四個接口,會幾項就實現幾個接口,這樣的話每個接口被復用的可能性是很高的。Java中的接口代表能力、代表約定、代表角色,能否正確的使用接口一定是編程水平高低的重要標識。)-合成聚合復用原則:優先使用聚合或合成關系復用代碼。-迪米特法則:迪米特法則又叫最少知識原則,一個對象應當對其他對象有盡可能少的了解。(迪米特法則簡單的說就是如何做到”低耦合”,門面模式和調停者模式就是對迪米特法則的踐行。對于門面模式可以舉一個簡單的例子,你去一家公司洽談業務,你不需要了解這個公司內部是如何運作的,你甚至可以對這個公司一無所知,去的時候只需要找到公司入口處的前臺美女,告訴她們你要做什么,她們會找到合適的人跟你接洽,前臺的美女就是公司這個系統的門面。再復雜的系統都可以為用戶提供一個簡單的門面,JavaWeb開發中作為前端控制器的Servlet或Filter不就是一個門面嗎,瀏覽器對服務器的運作方式一無所知,但是通過前端控制器就能夠根據你的請求得到相應的服務。調停者模式也可以舉一個簡單的例子來說明,例如一臺計算機,CPU、內存、硬盤、顯卡、聲卡各種設備需要相互配合才能很好的工作,但是如果這些東西都直接連接到一起,計算機的布線將異常復雜,在這種情況下,主板作為一個調停者的身份出現,它將各個設備連接在一起而不需要每個設備之間直接交換數據,這樣就減小了系統的耦合度和復雜度,如下圖所示。迪米特法則用通俗的話來將就是不要和陌生人打交道,如果真的需要,找一個自己的朋友,讓他替你和陌生人打交道。)49、簡述一下你了解的設計模式。答:所謂設計模式,就是一套被反復使用的代碼設計經驗的總結(情境中一個問題經過證實的一個解決方案)。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性幾個常用的設計模式:-工廠模式:工廠類可以根據條件生成不同的子類實例,這些子類有一個公共的抽象父類并且實現了相同的方法,但是這些方法針對不同的數據進行了不同的操作(多態方法)。當得到子類的實例后,開發人員可以調用基類中的方法而不必考慮到底返回的是哪一個子類的實例。-代理模式:給一個對象提供一個代理對象,并由代理對象控制原對象的引用。-適配器模式:把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起使用的類能夠一起工作。-
單例模式:一個類只有一個實例,即一個類只有一個對象實例。懶漢式單例模式,線程不安全,致命的是在多線程不能正常工作publicclassSingleton{privatestaticSingletoninstance=null;privateSingleton(){}publicstaticsynchronizedSingletongetInstance(){if(instance==null)instance=newSingleton();returninstance;}}餓漢式單例模式,避免了多線程的同步問題publicclassSingleton{privateSingleton(){}privatestaticSingletoninstance=newSingleton();publicstaticSingletongetInstance(){returninstance;}}50、用Java寫一個冒泡排序。for(inti=0;i<arr.length-1;i++){//外層循環控制排序趟數for(intj=0;j<arr.length-1-i;j++){//內層循環控制每一趟排序多少次if(arr[j]>arr[j+1]){inttemp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}51、用Java寫一個二分查找。非遞歸實現:publicstaticintbiSearch(int[]array,inta){intlo=0;inthi=array.length-1;intmid;while(lo<=hi){mid=(lo+hi)/2;if(array[mid]==a){returnmid+1;}elseif(array[mid]<a){lo=mid+1;}else{
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026蘇教二上解決問題教案
- 基站安全生產管理
- 腎活檢的并發癥及處理
- 感恩教育主題班會課件【圖文并茂】
- 企業盲盒營銷中稀有款對二級市場溢價的影響研究報告
- 《數控機床 故障診斷與維護》-教學單元5 伺服系統故障診斷及維護
- 企業海外項目融資專業培訓考核大綱
- Hysys在化工設備設計中的應用
- 高處作業吊籃操作工安全實操模擬考核試卷含答案
- 【新教材】人教版(2024)七年級上冊英語Starter Units 1-3語法知識講義(含練習題及答案)
- 鴻蒙應用開發認證考試題庫及答案
- 2025年國企營銷管理競聘筆試題庫(含答案)
- T CPCIF 0239-2023 石油和化工企業開車前安全審查導則
- 一次性使用止血套環產品技術要求北京中諾恒康生物
- 華為項目考核制度
- 河北河北省事業單位2025年面向新疆巴州兵團二師生源高校畢業生招聘15人筆試歷年參考題庫附帶答案詳解
- 啤酒廠安全生產管理課件
- 蘇州市新能源產業高質量發展三年行動計劃(2025-2026年)
- 單板五級理論題目及答案
- 江蘇中吳環保產業發展有限公司招聘筆試題庫2025
- 小學二年段期末考試試卷(2篇)
評論
0/150
提交評論