版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、面向對象的特征有哪些方面?答:面向對象的特征主要有以下兒個方面:1) 抽象:抽象是將一類對象的共同特征總結出來構造類的過程,包括數(shù)據(jù)抽象和行為抽象兩方面。抽象只關注對象有哪些屬性和行為,并不關注這些行為的細節(jié)是什么。2) 繼承:繼承是從已有類得到繼承信息創(chuàng)建新類的過程。提供繼承信息的類被稱為父類(超類、基類);得到繼承信息的類被稱為子類(派生類)。繼承讓變化中的軟件系統(tǒng)有了一定的延續(xù)性,同時繼承也是封裝程序中可變因素的重要手段(如果不能理解請閱讀閻宏博士的《Java與模式》或《設計模式精解》中關于橋梁模式的部分)。3) 封裝:通常認為封裝是把數(shù)據(jù)和操作數(shù)據(jù)的方法綁定起來,對數(shù)據(jù)的訪問只能通過已定義的接口。面向對象的本質就是將現(xiàn)實世界描繪成一系列完全自治、封閉的對象。我們在類中編寫的方法就是對實現(xiàn)細節(jié)的一種封裝;我們編寫一個類就是對數(shù)據(jù)和數(shù)據(jù)操作的封裝??梢哉f,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的編程接口(可以想想普通洗衣機和全自動洗衣機的差別,明顯全自動洗衣機封裝更好因此操作起來更簡單;我們現(xiàn)在使用的智能手機也是封裝得足夠好的,因為兒個按鍵就搞定了所有的事情)。4) 多態(tài)性:多態(tài)性是指允許不同子類型的對象對同一消息作出不同的響應。簡單的說就是用同樣的對象引用調用同樣的方法但是做了不同的事悄。多態(tài)性分為編譯時的多態(tài)性和運行時的多態(tài)性。如果將對象的方法視為對象向外界提供的服務,那么運行時的多態(tài)性可以解釋為:當A系統(tǒng)訪問B系統(tǒng)提供的服務時,B系統(tǒng)有多種提供服務的方式,但一切對A系統(tǒng)來說都是透明的(就像電動剃須刀是A系統(tǒng),它的供電系統(tǒng)是B系統(tǒng),B系統(tǒng)可以使用電池供電或者用交流電,其至還有可能是太陽能,A系統(tǒng)只會通過B類對象調用供電的方法,但并不知道供電系統(tǒng)的底層實現(xiàn)是什么,究竟通過何種方式獲得了動力)。方法重載(overload)實現(xiàn)的是編譯時的多態(tài)性(也稱為前綁定),而方法重寫(override)實現(xiàn)的是運行時的多態(tài)性(也稱為后綁定)。運行時的多態(tài)是面向對象最精SI的東西,要實現(xiàn)多態(tài)需要做兩件事:1.方法《寫(子類繼承父類并重寫父類中已有的或抽象的方法);2,對象造型(用父類型引用引用子類型對象,這樣同樣的引用調用同樣的方法就會根據(jù)子類對象的不同而表現(xiàn)出不同的行為)。2、String是最基本的數(shù)據(jù)類型嗎?答:不是。Java中的基本數(shù)據(jù)類型只有8個Jbyte、short、int、long、float、double>char、boolean:除了基本類型(primitivetype)和枚舉類型(enumerationtype),剩下的都是引用類型(referencetype)。3、shortsi=1:si=si+1;有錯嗎?shortsi=1: +=1;有錯嗎?si答:對于shortsi=1;si=si+1;山于1是int類因此S1+1運算結型,果也是int型,需要強制轉換類型才能賦值給short型。而shortsi=1:sl+=1;可以正確編譯,因為、1+二1;相當于S1=(short)(S1+1);其中有隱含的強制類型轉換。4、int和Integer有什么區(qū)別?答:Java是一個近乎純潔的面向對象編程語言,但是為了編程的方便還是引入不是對象的基本數(shù)據(jù)類型,但是為了能夠將這些基本數(shù)據(jù)類型當成對象操作,Java為每一個基本數(shù)據(jù)類型都引入了對應的包裝類型Wrapperclass),int的包裝類就是Integer,從JDK1.5開始引入了自動裝箱/拆箱機制,使得二者可以相互轉換。Java為每個原始類型提boolean,charsbyte,short?int,long,float,double供了包裝類Boolean,Character〉〉Byte,Short,IntegersLong,Float,型:原始類型:包裝類型:Double補充:最近還遇到一個面試題,也是和自動裝箱和拆箱相關的,代碼如下所示:如果不明就里很容易認為兩個輸出要么都是true要么都是false。首先需要注意的是fl、f2、f3、f4四個變量都是Integer對象,所以下面的二運算比較的不是值而是引用。裝箱的本質是什么呢?當我們給一個Integer對象賦一個int值的時候,會調用Integer類的靜態(tài)方法valueOf,如果看看valueOf的源代碼就知道發(fā)生了什么。簡單的說,如果字面量的值在-128到127之間,那么不會new新的Integer對象,而是直接引用常量池中的Integer對象,所以上面的面試題中fl==f2的結果是true,而f3=f4的結果是false。越是貌似簡單的面試題其中的玄機就越多,需要面試者有相當深療的功力。5、 解釋內存中的棧(stack)、堆(heap)和靜態(tài)存儲區(qū)的用法。答:通常我們定義一個基本數(shù)據(jù)類型的變量,一個對象的引用,還有就是函數(shù)調用的現(xiàn)場保存都使用內存中的??臻g;而通過new關鍵字和構造器創(chuàng)建的對象放在堆空間:程序中的字面量(literal)如直接書寫的100、“hello”和常ft都是放在靜態(tài)存儲區(qū)中。??臻g操作最快但是也很小,通常大量的對象都是放在堆空間,整個內存包括硬盤上的虛擬內存都可以被當成堆空間來使用。Stringstr=newString("hello”);上面的語句中str放在棧上,用new創(chuàng)建出來的字符吊對象放在堆上,而“hello”這個字面量放在靜態(tài)存儲區(qū)。補充:較新版本的Java中使用了一項叫“逃逸分析“的技術,可以將一些局部對象放在棧上以提升對象的操作性能。6、 swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?答:早期的JDK中,switch(expr)中,expr可以是byte、shortxcharinto從1.5版開始,Java中引入了枚舉類型(enum),expr也可以是枚舉,從JDK1.7版開始,還可以是字符宙(String)。長整型(long)是不可以的。7、 數(shù)組有沒有l(wèi)engthO方法?String有沒有l(wèi)ength()方法?答:數(shù)組沒有l(wèi)ength。方法,有l(wèi)ength的屬性。String有l(wèi)ength()方法。JavaScript中,獲得字符串的長度是通過length屬性得到的,這一點容易和Java混淆。8、 構造器(constructor)是否可被重寫(override)?答:構造器不能被繼承,因此不能被重寫,但可以被重載。9、 是否可以繼承String類?答:String類是final類,不可以被繼承。補充:繼承String本身就是一個錯誤的行為,對String類型最好的重用方式是關聯(lián)(HAS-A)而不是繼承(IS-10、 String和StringBuilder"StringBuffer的區(qū)另ij?答:Java平臺提供了兩種類型的字符吊:String和StringBuffer/StringBuilder,它們可以儲存和操作字符串。其中String是只讀字符串,也就意味著String引用的字符串內容是不能被改變的。而StringBuffer和StringBuilder類表示的字符串對象可以直接進行修改?StringBuilder是JDK1.5中引入的,它和StringBuffer的方法完全相同,區(qū)別在于它是在單線程環(huán)境下使用的,因為它的所有方面都沒有被synchronized修飾,因此它的效率也比StringBuffer略高?補充1:有一個面試題問:有沒有哪種悄況用+做字符吊連接比調用StringBuffer/StringBuilder對象的append方法性能更好?如果連接后得到的字符串在靜態(tài)存儲區(qū)中是早已存在的,那么用+做字符串連接是優(yōu)于StringBuffer/StringBuilder的append方法的。補充2:下面也是一個面試題,問程序的輸出,看看自己能不能說出正確答案。11、 描述一下JVM加載class文件的原理機制?答:JVM中類的裝載是山類加載器(ClassLoader)和它的子類來實現(xiàn)的,Java中的類加載器是一個重要的Java運行時系統(tǒng)組件,它負責在運行時查找和裝入類文件中的類。補充:1?山于Java的跨平臺性,經過編譯的Java源程序并不是一個可執(zhí)行程序,而是一個或多個類文件。當Java程序需要使用某個類時,JVM會確保這個類已經被加載、連接(驗證、準備和解析)和初始化。類的加載是指把類的?class文件中的數(shù)據(jù)讀入到內存中,通常是創(chuàng)建一個字節(jié)數(shù)組讀入?class文件,然后產生與所加載類對應的Class對象。加載完成后,Class對象還不完整,所以此時的類還不可用。當類被加載后就進入連接階段,這一階段包括驗證、準備(為靜態(tài)變量分配內存并設置默認的初始值)和解析(將符號引用替換為直接引用)三個步驟。最后JVM對類進行初始化,包括:1如果類存在直接的父類并且這個類還沒有被初始化,那么就先初始化父類;2如果類中存在初始化語句,就依次執(zhí)行這些初始化語句。2?類的加載是山類加載器完成的,類加載器包括:根加載器(Bootstrap)、擴展加載器(Extension),系統(tǒng)加載器(System)和用戶自定義類加載器(java.lang.ClassLoader的子類九從JDK1.2開始,類加載過程采取了父親委托機制(PDM)oPDM更好的保證了Java平臺的安全性,在該機制中,JVM自帶的Bootstrap是根加載器,其他的加載器都有且僅有一個父類加載器。類的加載首先請求父類加載器加載,父類加載器無能為力時才山其子類加載器自行加載。JVM不會向Java程序提供對Bootstrap的引用。下面是關于兒個類加載器的說明:Bootstrap:一般用本地代碼實現(xiàn),負責加載JVM基礎核心類庫(rt.jar);Extension:從java.ext.dirs系統(tǒng)屬性所指定的U錄中加載類庫,它的父加載器是Bootstrap;C)System:乂叫應用類加載器,其父類是Extension。它是應用最廣泛的類加載器。它從環(huán)境變量classpath或者系統(tǒng)屬性java,class,path所指定的U錄中記載類,是用戶自定義加載器的默認父加載器。12、 抽象類(abstractclass)和接口(interface)有什么異同?答:抽象類和接口都不能夠實例化,但可以定義抽象類和接口類型的引用。一個類如果繼承了某個抽象類或者實現(xiàn)了某個接口都需要對其中的抽象方法全部進行實現(xiàn),否則該類仍然需要被聲明為抽象類。接口比抽象類更加抽象,因為抽象類中可以定義構造器,可以有抽象方法和具體方法,而接口中不能定義構造器而且其中的方法全部都是抽象方法。抽象類中的成員可以是private"默認、protected"public的,而接口中的成員全都是public的。抽象類中可以定義成員變量,而接口中定義的成員變量實際上都是常量。有抽象方法的類必須被聲明為抽象類,而抽象類未必要有抽象方法。13、 Java中會存在內存泄漏嗎,請簡單描述。答:理論上Java因為有垃圾回收機制(GC)不會存在內存泄露問題(這也是Java被廣泛使用于服務器端編程的一個重要原因):然而在實際開發(fā)中,可能會存在無用但可達的對象,這些對象不能被GC回收也會發(fā)生內存泄露。一個例子就是Hibernate的Session(一級緩存)中的對象屬于持久態(tài),垃圾回收器是不會回收這些對象的,然而這些對象中可能存在無用的垃圾對象。下面的例子也展示了Java中發(fā)生內存泄露的悄況:上面的代碼實現(xiàn)了一個棧(先進后出(FIL0))結構,乍看之下似乎沒有什么明顯的問題,它其至可以通過你編寫的各種單元測試。然而其中的pop方法卻存在內存泄露的問題,當我們用pop方法彈出棧中的對象時,該對象不會被當作垃圾回收,即使使用棧的程序不再引用這些對象,因為棧內部維護著對這些對象的過期引用(obsoletereference)。在支持垃圾回收的語言中,內存泄露是很隱蔽的,這種內存泄露其實就是無意識的對象保持。如果一個對象引用被無意識的保留起來了,那么垃圾回收器不會處理這個對象,也不會處理該對象引用的其他對象,即使這樣的對象只有少數(shù)兒個,也可能會導致很多的對象被排除在垃圾回收之外,從而對性能造成重大影響,極端悄況下會引發(fā)DiskPaging(物理內存與硬盤的虛擬內存交換數(shù)據(jù)),其至造成OutOfMemoryErroro14、 靜態(tài)變量和實例變量的區(qū)別?答:靜態(tài)變ft是被static修飾符修飾的變量,也稱為類變量,它屬于類,不屬于類的任何一個對象,一個類不管創(chuàng)建多少個對象,靜態(tài)變量在內存中有且僅有一個拷貝;實例變量必須依存于某一實例,需要先創(chuàng)建對象然后通過對象才能訪問到它。靜態(tài)變量可以實現(xiàn)讓多個對象共學內存。在Java開發(fā)中,上下文類和工具類中通常會有大量的靜態(tài)成員。15、如何實現(xiàn)對象克???答:有兩種方式:1.實現(xiàn)Cloneable接口并卓寫Object類中的clone()方法;2?實現(xiàn)Serializable接口,通過對象的序列化和反序列化實現(xiàn)克隆,可以實現(xiàn)真正的深度克隆,代碼如下。注意:基于序列化和反序列化實現(xiàn)的克隆不僅僅是深度克隆,更重要的是通過泛型限定,可以檢查出要克隆的對象是否支持序列化,這項檢查是編譯器完成的,不是在運行時拋出異常,這種是方案明顯優(yōu)于使用Object類的clone方法克隆對象。Strings=newString("xyz”);創(chuàng)建了兒個字符吊對象?兩個對象,一個、是靜態(tài)存儲區(qū)的"xyz”,—個是用new創(chuàng)建在堆上的對象。一個java”源文件中是否可以包含多個類(不是內部類)?有什么限、答:可以,但一個源文件中最多只能有一個公開類(publicclass)而且文件名必須和公開類的類名完全保持一致。18、 內部類可以引用它的包含類(外部類)的成員嗎?有沒有什么限制?答:一個內部類對象可以訪問創(chuàng)建它的外部類對象的成員,包括私有成員。19、 指出下面程序的運行結果:答:執(zhí)行結果:Ia2b2bo創(chuàng)建對象時構造器的調用順序是:先初始化靜態(tài)成員,然后調用父類構造器,再初始化非靜態(tài)成員,最后調用自身構造器。20、 如何實現(xiàn)字符串的反轉及替換?答:方法很多,可以自己寫實現(xiàn)也可以使用String或StringBuffer/StringBuiIder中的方法。有一道很常見的面試題是用遞歸實現(xiàn)字符吊反轉。21、 日期和時間:1) 如何取得年月日、小時分鐘秒?2) 如何取得從1970年1月1日0時0分0秒到現(xiàn)在的毫秒數(shù)?3) 如何取得某月的最后一天?4) 如何格式化日期?答:操作方法如下所示:1) 創(chuàng)建java.util.Calendar實例,調用其get()方法傳入不同的參數(shù)即可獲得參數(shù)所對應的值2) 以下方法均可獲得該毫秒數(shù):3) 示例代碼如下:4) 利用java.text.DataFormat的子類(如Simp1eDateFormat類)中的format(Date)方法可將日期格式化。22、 比較一下Java和JavaSciprto答:JavaScript與Java是兩個公司開發(fā)的不同的兩個產品。Java是原Sun公司推出的面向對象的程序設計語言,特別適合于互聯(lián)網應用程序開發(fā):而JavaScript是Netscape公司的產品,為了擴展Netscape瀏覽器的功能而開發(fā)的一種可以嵌入Web頁面中運行的基于對象和事件驅動的解釋性語言,它的前身是LiveScript;而Java的前身是。ak語言。下面對兩種語言間的異同作如下比較:1) 基于對象和面向對象:Java是一種真正的面向對象的語言,即使是開發(fā)簡單的程序,必須設計對象;JavaScript是種腳本語言,它可以用來制作與網絡無關的,與用戶交互作用的復雜軟件。它是一種基于對象(Object-Based)和事件驅動(Event-Driven)的編程語言。因而它本身提供了非常豐S的內部對象供設計人員使用;2) 解釋和編譯:Java的源代碼在執(zhí)行之詢,必須經過編譯;JavaScript是一種解釋性編程語言,其源代碼不需經過編譯,山瀏覽器解釋執(zhí)行;3) 強類型變量和類型弱變量:采用強類型變量檢查,即所有變量在編譯之前必須作聲明:JavaScript中變量聲明,采用其弱類型。即變量在使用前不需作聲明,而是解釋器在運行時檢查其數(shù)據(jù)類型;4) 代碼格式不一樣。補充:上面列出的四點是原來所謂的標準答案中給出的。其實Java和JavaScript最重要的區(qū)別是一個是靜態(tài)語言,一個是動態(tài)語言。U詢的編程語言的發(fā)展趨勢是函數(shù)式語言和動態(tài)語言。在Java中類(class)是一等公民,而JavaScript中函數(shù)(function)是一等公民。對于這種問題,在面試時還是用自己的語言回答會更加靠譜。23、 Error和Exception有什么區(qū)別ij?答:Error表示系統(tǒng)級的錯誤和程序不必處理的異常,是恢復不是不可能但很困難的情況下的一種嚴重問題;比如內存溢出,不可能指望程序能處理這樣的悄況:Exception表示需要捕捉或者需要程序進行處理的異常,是一種設計或實現(xiàn)問題;也就是說,它表示如果程序運行正常,從不會發(fā)生的悄況。補充:2005年摩托羅立立的面試中曾經問過這么一個問題Tfaprocessreportsastackoverflowrun-timeerror,whatsthemostpossiblecause?",給了四個選項a.lackofmemory;b.writeonaninvalidmemoryspace:c.recursivefunctioncalling:d.arrayindexoutofboundary.Java程序在運行時也可能會遭遇StackOverflowError?這是一個錯誤無法恢復,只能重新修改代碼了,這個面試題的答案是6如果寫了不能迅速收斂的遞歸,則很有可能引發(fā)棧溢出的錯誤,如下所示:因此,用遞歸編寫程序時一定要牢記兩點:1.遞歸公式;2.收斂條件(什么時候就不再遞歸而是回溯了)。24、Java語言如何進行異常處理,關鍵字:throws>throw、try、catch、finally分別如何使用?答:Java通過面向對象的方法進行異常處理,把各種不同的異常進行分類,并提供了ft好的接口。在Java中,每個異常都是一個對象,它是Throwable類或其子類的實例。當一個方法出現(xiàn)異常后便拋出一個異常對象,該對象中包含有異常信息,調用這個對象的方法可以捕獲到這個異常并進行處理。Java的異常處理是通過5個關鍵詞來實現(xiàn)的:try、catch、throw、throws和finally。一般悄況下是用try來執(zhí)行一段程序,如果出現(xiàn)異常,系統(tǒng)會拋出(throw)一個異常,這時候你可以通過它的類型來捕捉(catch)它,或最后(finally)lli缺省處理器來處理;try用來指定一塊預防所有“異?!钡某绦颍籧atch子句緊跟在try塊后面,用來指定你想要捕捉的“異常”的類型;throw語句用來明確地拋出一個“異常”;throws用來標明一個成員函數(shù)可能拋出的各種“異?!眆inally為確保一段代碼不管發(fā)生什么“異?!倍急粓?zhí)行一段代碼;可以在一個成員函數(shù)調用的外面寫一個try語句,在這個成員函數(shù)內部寫另一個try語句保護其他代碼。每當遇到一個try語句,“異常”的框架就放到棧上面,直到所有的try語句都完成。如果下一級的try語句沒有對某種“異常”進行處理,棧就會展開,直到遇到有處理這種“異?!钡恼Z句。tryfinal,finally,finalize的區(qū)另ij?final:修飾符(關鍵字)有三種用法:如果一個類被聲明為final,意味25、 答:著它不能再派生出新的子類,即不能被繼承,因此它和abstract是反義詞。將變量聲明為final,可以保證它們在使用中不被改變,被聲明為final的變量必須在聲明時給定初值,而在以后的引用中只能讀取不可修改。被聲明為final的方法也同樣只能使用,不能在子類中被重寫。finally:通常放在try-catch的后面構造總是執(zhí)行代碼塊,這就意味著程序無論正常執(zhí)行還是發(fā)生異常,這里的代碼只要JVM不關閉都能執(zhí)行,可以將釋放外部資源的代碼寫在finally塊中。finalize:Object類中定義的方法,Java中允許使用finalize0方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是山垃圾收集器在銷毀對象時調用的,通過重寫finalize。方法可以整理系統(tǒng)資源或者執(zhí)行其他清理工作。VM內存可簡單分為三個區(qū):1、 堆區(qū)(heap):用于存放所有對象,是線程共享的(注:數(shù)組也屬于對象)2、 棧區(qū)(stack):用于存放基本數(shù)據(jù)類型的數(shù)據(jù)和對象的引用,是線程私有的(分為:虛擬機棧和本地方法棧)3、 方法區(qū)(method):用于存放類信息、常量、靜態(tài)變量、編譯后的字節(jié)碼等,是線程共享的(也被稱為非堆,即None-Heap)Java的垃圾回收器(GC)主要針對堆區(qū)。26、 如何停止一個正在運行的線程1、 使用退出標志,使線程正常退出,也就是當run方法完成后線程終止。2、 使用stop方法強行終止,但是不推薦這個方法,因為stop和suspend及resume一樣都是過期作廢的方法。3、 使用interrupt方法中斷線程。27、 notify()和notifyAlK)有什么區(qū)另ij?notify可能會導致死鎖,而notifyAll則不會任何時候只有一個線程可以獲得鎖,也就是說只有一個線程可以運行synchronized中的代碼使用notifyall.可以喚醒所有處于wait狀態(tài)的線程,使其重新進入鎖的爭奪隊列中,而notify只能喚醒一個。wait0應配合while循環(huán)使用,不應使用if,務必在wait()調用前后都檢查條件,如果不滿足,必須調用notify0喚醒另外的線程來處理,自己繼續(xù)wait0直至條件滿足再往下執(zhí)行。28、 sleep()和wait()有什么區(qū)別?對于sleep0方法,我們首先要知道該方法是屬于Thread類中的。而wait0方法,則是屬于Object類中的。sleep0方法導致了程序暫停執(zhí)行指定的時間,讓dlcpu該其他線程,但是他的監(jiān)控狀態(tài)依然保持者,當指定的時間到了乂會自動恢復運行狀態(tài)。在調用sleep0方法的過程中,線程不會釋放對象鎖。當調用waitO方法的時候,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調用notify0方法后本線程才進入對象鎖定池準備,獲取對象鎖進入運行狀態(tài)。29、 Thread類中的start()和run()方法有什么區(qū)別?start0方法被用來啟動新創(chuàng)建的線程,而且start()內部調用了run()方法,這和直接調用runO方法的效果不一樣。當你調用runO方法的時候,只會是在原來的線程中調用,沒有新的線程啟動,start0方法才會啟動新線程。30、 為什么wait和notify方法要在同步塊中調用?只有在調用線程擁有某個對象的獨占鎖時,才能夠調用該對象的wait0,notify0和notifyAll()方法。如果你不這么做,你的代碼會拋出IllegsdMonitorSterteException異常。還有一個原因是為了避免w&it和notify之間產生競態(tài)條件。砸it0方法強制當前線程釋放對象鎖。這意味著在調用某對象的waitO方法之前,當前線程必須已經獲得該對象的鎖。因此,線程必須在某個對象的同步方法或同步代碼塊中才能調用該對象的wait()方法。在調用對象的notify0和notifyAll。方法之前,調用線程必須已經得到該對象的鎖。因此,必須在某個對象的同步方法或同步代碼塊中才能調用該對象的notifyO或notifyAll0方法。調用waitO方法的原因通常是,調用線程希望某個特殊的狀態(tài)(或變量)被設置之后再繼續(xù)執(zhí)行。調用notify0或notifyAll()方法的原因通常是,調用線程希望告訴其他等待中的線程:〃特殊狀態(tài)已經被設置〃。這個狀態(tài)作為線程間通信的通道,它必須是一個可變的共學狀態(tài)(或變量)。31、 Java中synchronized和ReentrantLock有什么不同?相似點:、兩種同步方式有很多相似之處,它們都是加鎖方式同步,而且都是阻塞式的同步,也就是說當如果一個線程獲得了對象鎖,進入了同步塊,其他訪問該同步塊的線程都必須阻塞在同步塊外面等待,而進行線程阻塞和喚醒的代價是比較高的?區(qū)別:這兩種方式大區(qū)別就是對于Synchronized來說,它是java語言的關鍵字,是原生語法層面的互斥,需要jvm實現(xiàn)。而ReentrantLock它是JDK1.5之后提供的API層面的互斥鎖,需要lock()和unlock()方法配合try/fnally語句塊來完成。Synchronized進過編譯,會在同步塊的前后分別形成monitorenter和monitorexit這個兩個字節(jié)碼指令。在執(zhí)行monitorenter指令時,首先要嘗試獲取對象鎖。如果這個對象沒被鎖定,或者當前線程已經擁有了那個對象鎖,把鎖的il?算器加1,相應的,在執(zhí)行monitorexit指令時會將鎖計算器就減1,當計算器為0時,鎖就被釋放了。如果獲取對象鎖失敗,那當前線程就要阻塞,直到對象鎖被另一個線程釋放為止。山于ReentrantLock是java.util,concurrent包下提供的一套互斥鎖,相比Synchronized"ReentrantLock類提供了一些高級功能,主要有以下3項:1.等待可中斷,持有鎖的線程長期不釋放的時候,正在等待的線程可以選擇放棄等待,這相當于Synchronized來說可以避免出現(xiàn)死鎖的悄況。2?公平鎖,多個線程等待同一個鎖時,必須按照申請鎖的時間順序獲得鎖,Synchronized鎖非公平鎖,ReentrantLock默認的構造函數(shù)是創(chuàng)建的非公平鎖,可以通過參數(shù)true設為公平鎖,但公平鎖表現(xiàn)的性能不是很好。3.鎖綁定多個條件,一個ReentrantLock對象可以同時綁定對個對象。32、SynchronizedMap和ConcurrentHashMap有什么區(qū)別ij?SynchronizedMap()和Hashtable一樣,實現(xiàn)上在調用map所有方法時,都對整個map進行同步。而ConcurrentHashMap的實現(xiàn)卻更加精細,它對map中的所有桶加了鎖。所以,只要有一個線程訪問map,其他線程就無法進入map,而如果一個線程在訪問ConcurrentHashMap某個桶時,其他線程,仍然可以對map執(zhí)行某些操作。所以,ConcurrentHashMap在性能以及安全性方面,明顯比Collections.SynchronizedMap()ions.更加有優(yōu)勢。同時,同步操作精確控制到桶,這樣,即使在遍歷m&p時,如果 其他線程試圖對m&p進行數(shù)據(jù)修改,也不會拋出ConcurrentModificationExceptiono33、ion。Thread類中的yield方法有什么作用?Yield方法可以暫停當前正在執(zhí)行的線程對象,讓其它有相同優(yōu)先級的線程執(zhí)行。它是一個靜態(tài)方法而且只保證當前線程放棄CPU占用而不能保證使其它線程一定能占用CPU,執(zhí)行yieldO的線程有可能在進入到暫停狀態(tài)后馬上乂被執(zhí)行。34、說一說自己對于synchronized關鍵字的了解synchronized關鍵字解決的是多個線程之間訪問資源的同步性,synchronized關鍵字可以保證被它修飾的方法或者代碼塊在任意時刻只能有一個線程執(zhí)行。另外,在Java早期版本中,synchronized屬于重量級鎖,效率低下,因為監(jiān)視器鎖(monitor)是依賴于底層的操作系統(tǒng)的MutexLock來實現(xiàn)的,Java的線程是映射到操作系統(tǒng)的原生線程之上的。如果要掛起或者喚醒一個線程,都需要操作系統(tǒng)幫忙完成,而操作系統(tǒng)實現(xiàn)線程之間的切換時需要從用戶態(tài)轉換到內核態(tài),這個狀態(tài)之間的轉換需要相對比較長的時間,時間成本相對較高,這也是為什么早期的synchronized效率低的原因。慶幸的是在Java6之后Java官方對從JVM層面對synchronized較大優(yōu)化,所以現(xiàn)在的synchronized鎖效率也優(yōu)化得很不錯了。JDK1.6對鎖的實現(xiàn)引入了大量的優(yōu)化,如自旋鎖、適應性自旋鎖、鎖消除、鎖粗化、偏向鎖、輕量級鎖等技術來減少鎖操作的開銷。35、什么是線程安全?Vector是一個線程安全類嗎?如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。一個線程安全的il?數(shù)器類的同一個實例對象在被多個線程使用的請況下也不會出現(xiàn)計算失誤。很顯然你可以將集合類分成兩組,線程安全和非線程安全的。Vector是用同步方法來實現(xiàn)線程安全的,而和它相似的ArrayList不是線程安全的。36、 常用的線程池有哪些?newSingleThreadExecutor:創(chuàng)建一個單線程的線程池,此線程池保證所有任務的執(zhí)行順序按照任務的提交順序執(zhí)行。newFixedThreadPool:創(chuàng)建固定大小的線程池,每次提交一個任務就創(chuàng)建一個線程,直到線程達到線程池的大大小。newCachedThreadPool:創(chuàng)建一個可緩存的線程池,此線程池不會對線程池大小做限制,線程池大小完全依賴于操作系統(tǒng)(或者說JVM)能夠創(chuàng)建的大線程大小。newScheduledThreadPool:創(chuàng)建一個大小無限的線程池,此線程池支持定時以及周期性執(zhí)行任務的需求。newSingleThreadExecutor:創(chuàng)建一個單線程的線程池。此線程池支持定時以及周期性執(zhí)行任務的需求。37、 Java程序是如何執(zhí)行的我們日常的工作中都使用開發(fā)工具(IntelliJIDEA或Eclipse等)可以很方便的調試程序,或者是通過打包工具把項U打包成jar包或者war包,放入Tomcat等Web容器中就可以正常運行了,但你有沒有想過Java程序內部是如何執(zhí)行的?其實不論是在開發(fā)工具中運行還是在Tomcat中運行,Java程序的執(zhí)行流程基本都是相同的,它的執(zhí)行流程如下:先把Java代碼編譯成字節(jié)碼,也就是把Java類型的文件編譯成.class類型的文件。這個過程的大致執(zhí)行流程:Java源代碼->詞法分析器->語法分析器->語義分析器->字符碼生成器->終生成字節(jié)碼,其中任何一個節(jié)點執(zhí)行失敗就會造成編譯失??;把class文件放置到Java虛擬機,這個虛擬機通常指的是Oracle官方自帶的HotspotJVM:Java虛擬機使用類加載器(ClassLoader)裝載class文件:類加載完成之后,會進行字節(jié)碼效驗,字節(jié)碼效驗通過之后JVM解釋器會把字節(jié)碼翻譯成機器碼交山操作系統(tǒng)執(zhí)行。但不是所有代碼都是解釋執(zhí)行的,JVM對此做了優(yōu)化,比如,以Hotspot虛擬機來說,它本身提供了JIT(JustInTime)也就是我們通常所說的動態(tài)編譯器,它能夠在運行時將熱點代碼編譯為機器碼,這個時候字節(jié)碼就變成了編譯執(zhí)行。38、 說說自己是怎么使用synchronized關鍵字,在項U中用到了嗎synchronized關鍵字最主要的三種使用方式s修飾實例方法,作用于當前對象實例加鎖,進入同步代碼前要獲得當前對象實例的鎖修飾靜態(tài)方法,作用于當前類對象加鎖,進入同步代碼前要獲得當前類對象的鎖。也就是給當前類加鎖,會作用于類的所有對象實例,因為靜態(tài)成員不屬于任何一個實例對象,是類成員(static表明這是該類的一個靜態(tài)資源,不管new了多少個對象,只有一份,所以對該類的所有對象都加了鎖)。所以如果一個線程A調用一個實例對象的非靜態(tài)synchronized方法,而線程B需要調用這個實例對象所屬類的靜態(tài)synchronized方法,是允許的,不會發(fā)生互斥現(xiàn)象,因為訪問靜態(tài)synchronized方法占用的鎖是當前類的鎖,而訪問非靜態(tài)synchronized方法占用的鎖是當前實例對象鎖。修飾代碼塊,指定加鎖對象,對給定對象加鎖,進入同步代碼庫前要獲得給定對象的鎖。和synchronized方法一樣,synchronized(this)代碼塊也是鎖定當詢對象的。synchronized關鍵字加到static靜態(tài)方法和synchronized(class)代碼塊上都是是給Class類上鎖。這里再提一下:synchronized關鍵字加到非static靜態(tài)方法上是給對象實例上鎖。另外需要注意的是:盡量不要使用synchronized(Stringa)因為JVM中,字符串常量池具有緩沖功能!下面我已一個常見的面試題為例講解一下synchronized關鍵字的具體使用。面試中面試官經常會說:“單例模式了解嗎?來給我手寫一下!給我解釋一下雙重檢驗鎖方式實現(xiàn)單利模式的原理唄!”PublicclassSingleton(pm'atevolatilestaticSingletonimiqueliistance;pm'ateSingleton()(}publicstaticSingletonge
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園餐飲供貨協(xié)議
- 附錄一國家行政機關公文處理辦法現(xiàn)代應用文書寫作(第三版)教學課件電子教案
- 2025年度個人所得稅贍養(yǎng)老人專項附加扣除協(xié)議執(zhí)行細則4篇
- 2025年度個人留學擔保合同模板
- 2025年度個人收入證明范本及稅務合規(guī)服務合同
- 2025-2030全球氫混合鍋爐行業(yè)調研及趨勢分析報告
- 2025-2030全球CO2激光冷水機行業(yè)調研及趨勢分析報告
- 2024年女職工權益保護及性別平等知識有獎知識競賽題庫及答案
- 2024年居民健康素養(yǎng)知識競賽考試題庫含答案
- 2025年個人間技術秘密保護保密合同4篇
- 2025年上半年江蘇連云港灌云縣招聘“鄉(xiāng)村振興專干”16人易考易錯模擬試題(共500題)試卷后附參考答案
- DB3301T 0382-2022 公共資源交易開評標數(shù)字見證服務規(guī)范
- 人教版2024-2025學年八年級上學期數(shù)學期末壓軸題練習
- 【人教版化學】必修1 知識點默寫小紙條(答案背誦版)
- 俄語版:中國文化概論之中國的傳統(tǒng)節(jié)日
- 《奧特萊斯業(yè)態(tài)淺析》課件
- 2022年湖南省公務員錄用考試《申論》真題(縣鄉(xiāng)卷)及答案解析
- 婦科一病一品護理匯報
- 養(yǎng)殖場獸醫(yī)服務合同
- 哪吒之魔童降世
- HR六大板塊+三支柱體系
評論
0/150
提交評論