java面試題複習(二)

//我又回來了java

十一、數組有沒有length()方法?String有沒有length()方法?c++

數組只有length屬性,String有length()方法。注意:JavaScript獲取字符串長度使用length屬性。//寫個數組和字符串,再來個點+(alt+/)來看看程序員

十二、Java中,如何跳出當前的多重嵌套循環?編程

在最外層前加上標記而後用「break 標記」,能夠跳出多重循環。數組

1三、構造器(constructor)是否可被重寫(override)緩存

固然不能了,構造器都不能被繼承,因此不能重寫,但能夠重載//又是重載和重寫的問題安全

1四、兩個對象值相同(x.equals(y) == true),他們的hashcode是否相同服務器

Java對於eqauls方法和hashCode方法是這樣規定的:(1)若是兩個對象相同(equals方法返回true),那麼它們的hashCode值必定要相同;(2)若是兩個對象的hashCode相同,它們並不必定相同。//充分非必要條件jvm

因此兩個對象值相同時hashcode也相同//ide

偷來的補充:關於equalshashCode方法,不少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)和一致性(當xy引用的對象信息沒有被修改時,屢次調用x.equals(y)應該獲得一樣的返回值),並且對於任何非null值的引用xx.equals(null)必須返回false。實現高質量的equals方法的訣竅包括:1. 使用==操做符檢查參數是否爲這個對象的引用2. 使用instanceof操做符檢查參數是否爲正確的類型3. 對於類中的關鍵屬性,檢查參數傳入對象的屬性是否與之相匹配;4. 編寫完equals方法後,問本身它是否知足對稱性、傳遞性、一致性;5. 重寫equals時老是要重寫hashCode6. 不要將equals方法參數中的Object對象替換爲其餘的類型,在重寫時不要忘掉@Override註解。

1五、當一個對象被看成參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裏究竟是值傳遞仍是引用傳遞?
是值傳遞。Java語言的方法調用只支持參數的值傳遞。當一個對象實例做爲一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的屬性能夠在被調用過程當中被改變,但對對象引用的改變是不會影響到調用者的。C++和C#中能夠經過傳引用或傳輸出參數來改變傳入的參數的值。//趕忙去學c++

1六、char 型變量中能不能存儲一箇中文漢字,爲何

char類型能夠存儲一箇中文漢字,由於Java中使用的編碼是Unicode(不選擇任何特定的編碼,直接使用字符在字符集中的編號,這是統一的惟一方法),一個char類型佔2個字節(16比特)

1七、抽象類和接口的異同

同:抽象類和接口都不可以實例化,但能夠定義抽象類和接口類型的引用。一個類若是繼承了某個抽象類或者實現了某個接口都須要對其中的抽象方法所有進行實現,不然該類仍然須要被聲明爲抽象類。

異:抽象類中能夠定義構造器,能夠有抽象方法和具體方法,而接口中不能定義構造器並且其中的方法所有都是抽象方法。

抽象類中的成員能夠是private、默認、protected、public的,而接口中的成員全都是public的。

抽象類中能夠定義成員變量,而接口中定義的成員變量實際上都是常量。有抽象方法的類必須被聲明爲抽象類,而抽象類未必要有抽象方法

1八、類加載機制?

程序調用某個類時,若是該類在內存中不存在,則系統會經過加載、鏈接、初始化三個步驟對類初始化;類的加載是將類的class文件讀入到內存中,併爲之建立一個class的對象;類的加載由jvm完成,jvm類加載機制是,父類委託、所有加載、緩存機制

1九、描述一下JVM加載class文件的原理機制?

JVM中類的裝載是由類加載器(ClassLoader)和它的子類來實現的,Java中的類加載器是一個重要的Java運行時系統組件,它負責在運行時查找和裝入類文件中的類。
因爲Java的跨平臺性,通過編譯的Java源程序並非一個可執行程序,而是一個或多個類文件。當Java程序須要使用某個類時,JVM會確保這個類已經被加載、鏈接(驗證、準備和解析)和初始化。類的加載是指把類的.class文件中的數據讀入到內存中,一般是建立一個字節數組讀入.class文件,而後產生與所加載類對應的Class對象。加載完成後,Class對象還不完整,因此此時的類還不可用。當類被加載後就進入鏈接階段,這一階段包括驗證、準備(爲靜態變量分配內存並設置默認的初始值)和解析(將符號引用替換爲直接引用)三個步驟。最後JVM對類進行初始化,包括:1)若是類存在直接的父類而且這個類尚未被初始化,那麼就先初始化父類;2)若是類中存在初始化語句,就依次執行這些初始化語句。
類的加載是由類加載器完成的,類加載器包括:根加載器(BootStrap)、擴展加載器(Extension)、系統加載器(System)和用戶自定義類加載器(java.lang.ClassLoader的子類)。從Java 2(JDK 1.2)開始,類加載過程採起了父親委託機制(PDM)。PDM更好的保證了Java平臺的安全性,在該機制中,JVM自帶的Bootstrap是根加載器,其餘的加載器都有且僅有一個父類加載器。類的加載首先請求父類加載器加載,父類加載器無能爲力時才由其子類加載器自行加載。JVM不會向Java程序提供對Bootstrap的引用

20、java的內存溢出

堆棧溢出

堆棧先進後出,有兩個基本操做,push棧頂加,pop棧頂減。形成的緣由:過多的函數調用致使堆棧沒法容納這些調用的返回地址,通常在遞歸調用產生。如輸入字符串過長,數組容納不下,繼續向棧頂寫字符,提早申請動態內存能夠避免,但若是堆棧生長方向和內存生長方向相反,在返回時就會出錯

理論上Java由於有垃圾回收機制(GC)不會存在內存泄露問題(這也是Java被普遍使用於服務器端編程的一個重要緣由);然而在實際開發中,可能會存在無用但可達的對象,這些對象不能被GC回收,所以也會致使內存泄露的發生。//對象處於持久態,就不會回收;

通常是程序所需求的棧深度過大致使的。解決時要分清是內存泄露仍是內存不足

jvm內存泄漏:調大-xmx-xms參數

持久帶內存溢出:class對象釋放(有過多的class對象,class對象佔用信息過多)

沒法建立本地線程:總容量不變,減少堆內存和非堆內存(線程內存不足)

遞歸改非遞歸,全局變量代替局部變量

相關文章
相關標籤/搜索