那些經常被問的JAVA面試題(2)—— 基礎

tianxiaoxu發表於2018-07-02

【本文轉自極客原創 作者:張鋒 

原文連結:https://mp.weixin.qq.com/s/mU8C7DDU-6-DdwAVk6z6tA】


什麼是值傳遞和引用傳遞?

值傳遞是對基本型變數而言的,傳遞的是該變數的一個副本,改變副本不影響原變數. 引用傳遞一般是對於物件型變數而言的,傳遞的是該物件地址的一個副本, 並不是原物件本身 。 一般認為,java內的傳遞都是值傳遞. java中例項物件的傳遞是引用傳遞 。

是否可以在static環境中訪問非static變數?

static變數在Java中是屬於類的,它在所有的例項中的值是一樣的。當類被Java虛擬機器載入的時候,會對static變數進行初始化。如果你的程式碼嘗試不用例項來訪問非static的變數,編譯器會報錯,因為這些變數還沒有被建立出來,還沒有跟任何例項關聯上。

解釋記憶體中的棧(stack)、堆(heap)和方法區(method area)的用法。

通常我們定義一個基本資料型別的變數,一個物件的引用,還有就是函式呼叫的現場儲存都使用JVM中的棧空間;而通過new關鍵字和構造器建立的物件則放在堆空間,堆是垃圾收集器管理的主要區域,由於現在的垃圾收集器都採用分代收集演算法,所以堆空間還可以細分為新生代和老生代,再具體一點可以分為Eden、Survivor(又可分為From Survivor和To Survivor)、Tenured;方法區和堆都是各個執行緒共享的記憶體區域,用於儲存已經被JVM載入的類資訊、常量、靜態變數、JIT編譯器編譯後的程式碼等資料;程式中的字面量(literal)如直接書寫的100、”hello”和常量都是放在常量池中,常量池是方法區的一部分,。棧空間操作起來最快但是棧很小,通常大量的物件都是放在堆空間,棧和堆的大小都可以通過JVM的啟動引數來進行調整,棧空間用光了會引發StackOverflowError,而堆和常量池空間不足則會引發OutOfMemoryError。

介面和抽象類的區別是什麼?

從設計層面來說,抽象是對類的抽象,是一種模板設計,介面是行為的抽象,是一種行為的規範。

Java提供和支援建立抽象類和介面。它們的實現有共同點,不同點在於: **介面中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。 **

類可以實現很多個介面,但是隻能繼承一個抽象類 類可以不實現抽象類和介面宣告的所有方法,當然,在這種情況下,類也必須得宣告成是抽象的。

抽象類可以在不提供介面方法實現的情況下實現介面。 **Java介面中宣告的變數預設都是final的。抽象類可以包含非final的變數。 Java介面中的成員函式預設是public的。抽象類的成員函式可以是private,protected或者是public。 **

介面是絕對抽象的,不可以被例項化。抽象類也不可以被例項化,但是,如果它包含main方法的話是可以被呼叫的。 也可以參考JDK8中抽象類和介面的區別。

String和StringBuilder、StringBuffer的區別?

Java平臺提供了兩種型別的字串:String和StringBuffer/StringBuilder,它們可以儲存和操作字串。其中String是隻讀字串,也就意味著String引用的字串內容是不能被改變的。而StringBuffer/StringBuilder類表示的字串物件可以直接進行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,區別在於它是在單執行緒環境下使用的,因為它的所有方面都沒有被synchronized修飾,因此它的效率也比StringBuffer要高。

如果兩個鍵的hashcode相同,你如何獲取值物件?

當我們呼叫get()方法,HashMap會使用鍵物件的hashcode找到bucket位置,然後會呼叫keys.equals()方法去找到連結串列中正確的節點,最終找到要找的值物件。

HashMap和Hashtable有什麼區別?

1、HashMap是非執行緒安全的,HashTable是執行緒安全的。

2、HashMap的鍵和值都允許有null值存在,而HashTable則不行。

3、因為執行緒安全的問題,HashMap效率比HashTable的要高。

4、Hashtable是同步的,而HashMap不是。因此,HashMap更適合於單執行緒環境,而Hashtable適合於多執行緒環境。

一般現在不建議用HashTable, ①是HashTable是遺留類,內部實現很多沒優化和冗餘。②即使在多執行緒環境下,現在也有同步的ConcurrentHashMap替代,沒有必要因為是多執行緒而用HashTable。

如何決定選用HashMap還是TreeMap?

對於在Map中插入、刪除和定位元素這類操作,HashMap是最好的選擇。然而,假如你需要對一個有序的key集合進行遍歷,TreeMap是更好的選擇。基於你的collection的大小,也許向HashMap中新增元素會更快,將map換為TreeMap進行有序key的遍歷。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31137683/viewspace-2157195/,如需轉載,請註明出處,否則將追究法律責任。

相關文章