Java面試題集錦(持續更新)

一、面向對象的特徵有哪些方面?

答:面向對象的特徵主要有如下幾個方面:程序員

-抽象:抽象是將一類對象的共同特徵總結出來構造類的過程,包括數據抽象和行爲抽象兩方面。抽象只關注對象有哪些屬性和行爲,並不關注這些行爲的細節是什麼。面試

-繼承:繼承是從己有類獲得繼承信息建立新類的過程。提供繼承信息的類被稱爲父類(超類、基類);獲得繼承信息的類被稱爲子類(派生類)。繼承讓變化中的軟件系統有了必定的延續性,同時繼承也是封裝程序中可變因素的重要手段(若是不能理解請閱讀閻宏博士的《Java與模式》或《設計模式精解》中關於橋樑模式的部分)。算法

-封裝:一般認爲封裝是把數據和操做數據的方法綁定起來,對數據的訪問只能經過己定義的接口。面向對象的本質就是將現實世界描繪成一系列徹底自治、封閉的對象。咱們在類中編寫的方法就是對實現細節的一種封裝;咱們編寫一個類就是對數據和數據操做的封裝。能夠說,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的編程接口(能夠想一想普通洗衣機和全自動洗衣機的差異,明顯全自動洗衣機封裝更好所以操做起來更簡單;咱們如今使用的智能手機也是封裝得足夠好的,由於幾個按鍵就搞定了全部的事情)。編程

-多態性:多態性是指容許不一樣子類型的對象對同一消息做出不一樣的響應。簡單的說就是用一樣的對象引用調用一樣的方法可是作了不一樣的事情。多態性分爲編譯時的多態性和運行時的多態性。若是將對象的方法視爲對象向外界提供的服務,那麼運行時的多態性能夠解釋爲:當A系統訪問B系統提供的服務時,B系統有多種提供服務的方式,但一切對A系統來講都是透明的(就像電動剃鬚刀是A系統,它的供電系統是B系統,B系統可使用電池供電或者用交流電,甚至還有多是太陽能,A系統只會經過B類對象調用供電的方法,但並不知道供電系統的底層實現是什麼,究竟經過何種方式得到了動力)。方法重載(overload)實現的是編譯時的多態性(也稱爲前綁定),而方法重寫(override)實現的是運行時的多態性(也稱爲後綁定)。運行時的多態是面向對象最精髓的東西,要實現多態須要作兩件事:1).方法重寫(子類繼承父類並重寫父類中己有的或抽象的方法);2).對象造型(用父類型引用引用子類型對象,這樣一樣的引用調用一樣的方法就會根據子類對象的不一樣而表現出不一樣的行爲)。設計模式

 

 

二、 解釋內存中的棧(stack)、堆(heap)和方法區(method area)的用法。

答:一般咱們定義一個基本數據類型的變量,一個對象的引用,還有就是函數調用的現場保存都使用JVM中的棧空間;而經過new關鍵字和構造器建立的對象則放在堆空間,堆是垃圾收集器管理的主要區域,因爲如今的垃圾收集器都採用分代收集算法,因此堆空間還能夠細分爲新生代和老生代,再具體一點能夠分爲 Eden、Survivor (又可分爲 From SurvivorTo Survivor)、Tenured;方法區和堆都是各個線程共享的內存區域,用於存儲己經被JVM加載的類信息、常量、靜態變量、JIT編譯器編譯後的代碼等數據;程序中的字面量(literal)如直接書寫的100、"hello"和常量都是放在常量池中,常量池是方法區的一部分,棧空間操做起來最快可是棧很小,一般大量的對象都是放在堆空間,棧和堆的大小均可以經過JVM的啓動參數來進行調整,棧空間用光了會引起StackOverflowError,而堆和常量池空間不足則會引起OutOfMemoryError 。String str = new String("hello");數組

上面的語句中變量str放在棧上,用new建立出來的字符串對象放在堆上,而"hello"這個字面量是放在方法區的。ide

 

3 、數組有沒有 length()方法?String 有沒有 length() 方法?

答:數組沒有 length()方法,有 length 的屬性。String 有 length()方法。JavaScript 中,得到字符串的長度是經過 length 屬性獲得的,這一點容易和Java 混淆。函數

 

 

 

4 、兩個對象值相同 (x.equals(y) == true) ,但卻可有不一樣的 hash code ,這句話對不對?

答:不對,若是兩個對象 x 和 y 知足 x.equals(y) == true,它們的哈希碼(hash code)應當相同。Java 對於 eqauls 方法和 hashCode 方法是這樣規定的:(1)若是兩個對象相同(equals 方法返回 true),那麼它們的 hashCode 值必定要相同;(2)若是兩個對象的 hashCode 相同,它們並不必定相同。固然,你未必要按照要求去作,可是若是你違背了上述原則就會發如今使用容器時,相同的對象能夠出如今 Set 集合中,同時增長新元素的效率會大大降低(對於使用哈希存儲的系統,若是哈希碼頻繁的衝突將會形成存取性能急劇降低)。性能

補充:關於 equals 和 hashCode 方法,不少 Java 程序都知道,但不少人也就是僅僅知道而已,在 Joshua Bloch 的大做《Effective Java》(不少軟件公司,《Effective Java》、《Java 編程思想》以及《重構:改善既有代碼質量》是Java 程序員必看書籍,若是你還沒看過,那就趕忙去亞馬遜買一本吧)中是這樣介紹 equals 方法的:首先 equals 方法必須知足自反性(x.equals(x)必須返回 true)、對稱性(x.equals(y)返回 true 時,y.equals(x)也必須返回true)、傳遞性(x.equals(y)和 y.equals(z)都返回 true 時,x.equals(z)也必須返回 true)和一致性(當 x 和 y 引用的對象信息沒有被修改時,屢次調用x.equals(y)應該獲得一樣的返回值),並且對於任何非 null 值的引用 x,x.equals(null)必須返回 false。實現高質量的 equals 方法的訣竅包括:1.使用==操做符檢查"參數是否爲這個對象的引用";2. 使用 instanceof 操做符檢查"參數是否爲正確的類型";3. 對於類中的關鍵屬性,檢查參數傳入對象的屬性是否與之相匹配;4. 編寫完 equals 方法後,問本身它是否知足對稱性、傳遞性、一致性;5. 重寫 equals 時老是要重寫 hashCode;6. 不要將 equals方法參數中的 Object 對象替換爲其餘的類型,在重寫時不要忘掉@Override 註解。ui

 

六、重載( Overload )和重寫( Override )的區別。重載的方法可否根據返回類型進行區分?

答:方法的重載和重寫都是實現多態的方式,區別在於前者實現的是編譯時的多態性,然後者實現的是運行時的多態性。重載發生在一個類中,同名的方法若是有不一樣的參數列表(參數類型不一樣、參數個數不一樣或者兩者都不一樣)則視爲重載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的返回類型,比父類被重寫方法更好訪問,不能比父類被重寫方法聲明更多的異常(里氏代換原則)。重載對返回類型沒有特殊的要求。
 
 
面試題:華爲的面試題中曾經問過這樣一個問題 - "爲何不能根據返回類型來區分重載",快說出你的答案吧!
 

七、String和StringBuilder、StringBuffer的區別?

答:Java平臺提供了兩種類型的字符串:String 和 StringBuffer、StringBuilder,它們能夠儲存和操做字符串。其中String引用的字符串內容是不能被改變的,而StringBuffer/StringBuilder類表示的字符串對象能夠直接進行修改。StringBuilder是Java5中引入的,它和StringBuffer的方法徹底相同,區別在於它是在單線程環境下使用的,由於它的全部方面都沒有被synchronized修飾,所以它的效率也比StringBuffer要高。

相關文章
相關標籤/搜索