java實習生面試總結
一、JAVA基礎篇-概念
1.簡述你所知道的Linux: Linux起源於1991年,1995年流行起來的免費作業系統,目前, Linux是主流的伺服器作業系統, 廣泛應用於網際網路、雲端計算、智慧手機(Android)等領域。由於Java主要用於伺服器端的開發,因此Java應用的部署環境有很多為Linux。 Windows作業系統的目錄結構,是以碟符為單位,C盤、D盤、E盤等等,資料儲存在各個碟符之下,而Linux作業系統最頂層只有一個根目錄root,所有檔案都儲存在這一個根目錄之下。 Linux不像Windows的圖形操作介面,是通過命令的方式進行操作,常用命令有: a . pwd:用於顯示當前工作目錄; b . ls:用於檢視當前工作目錄內容; c . cd:用於改變當前工作目錄。 2.什麼是Java虛擬機器?為什麼Java被稱作是“平臺無關的程式語言”?
二、JAVA基礎篇-集合與陣列
18.Java集合框架是什麼?說出一些集合框架的優點? 每種程式語言中都有集合,最初的Java版本包含幾種集合類:Vector、Stack、HashTable和Array。隨著集合的廣泛使用,Java1.2提出了囊括所有集合介面、實現和演算法的集合框架。在保證執行緒安全的情況下使用泛型和併發集合類,Java已經經歷了很久。它還包括在Java併發包中,阻塞介面以及它們的實現。集合框架的部分優點如下: (1)使用核心集合類降低開發成本,而非實現我們自己的集合類。 (2)隨著使用經過嚴格測試的集合框架類,程式碼質量會得到提高。 (3)通過使用JDK附帶的集合類,可以降低程式碼維護成本。 (4)複用性和可操作性。 19.集合框架中的泛型有什麼優點? Java1.5引入了泛型,所有的集合介面和實現都大量地使用它。泛型允許我們為集合提供一個可以容納的物件型別,因此,如果你新增其它型別的任何元素,它會在編譯時報錯。這避免了在執行時出現ClassCastException,因為你將會在編譯時得到報錯資訊。泛型也使得程式碼整潔,我們不需要使用顯式轉換和instanceOf操作符。它也給執行時帶來好處,因為不會產生型別檢查的位元組碼指令。 20.Java集合框架的基礎介面有哪些? Collection為集合層級的根介面。一個集合代表一組物件,這些物件即為它的元素。Java平臺不提供這個介面任何直接的實現。## 標題 ## Set是一個不能包含重複元素的集合。這個介面對數學集合抽象進行建模,被用來代表集合,就如一副牌。 List是一個有序集合,可以包含重複元素。你可以通過它的索引來訪問任何元素。List更像長度動態變換的陣列。 Map是一個將key對映到value的物件.一個Map不能包含重複的key:每個key最多隻能對映一個value。 一些其它的介面有Queue、Dequeue、SortedSet、SortedMap和ListIterator。 21.為何Collection不從Cloneable和Serializable介面繼承? Collection介面指定一組物件,物件即為它的元素。如何維護這些元素由Collection的具體實現決定。例如,一些如List的Collection實現允許重複的元素,而其它的如Set就不允許。很多Collection實現有一個公有的clone方法。然而,把它放到集合的所有實現中也是沒有意義的。這是因為Collection是一個抽象表現。重要的是實現。 當與具體實現打交道的時候,克隆或序列化的語義和含義才發揮作用。所以,具體實現應該決定如何對它進行克隆或序列化,或它是否可以被克隆或序列化。 在所有的實現中授權克隆和序列化,最終導致更少的靈活性和更多的限制。特定的實現應該決定它是否可以被克隆和序列化。 22.為何Map介面不繼承Collection介面? 儘管Map介面和它的實現也是集合框架的一部分,但Map不是集合,集合也不是Map。因此,Map繼承Collection毫無意義,反之亦然。 如果Map繼承Collection介面,那麼元素去哪兒?Map包含key-value對,它提供抽取key或value列表集合的方法,但是它不適合“一組物件”規範。 23.什麼是迭代器(Iterator)? Iterator介面提供了很多對集合元素進行迭代的方法。每一個集合類都包含了可以返回迭代器例項的迭代方法。迭代器可以在迭代的過程中刪除底層集合的元素,但是不可以直接呼叫集合的remove(Object Obj)刪除,可以通過迭代器的remove()方法刪除。 24.Iterator和ListIterator的區別是什麼? 下面列出了他們的區別: Iterator可用來遍歷Set和List集合,但是ListIterator只能用來遍歷List。 Iterator對集合只能是前向遍歷,ListIterator既可以前向也可以後向。 ListIterator實現了Iterator介面,幷包含其他的功能,比如:增加元素,替換元素,獲取前一個和後一個元素的索引,等等。 25.快速失敗(fail-fast)和安全失敗(fail-safe)的區別是什麼? 快速失敗:當你在迭代一個集合的時候,如果有另一個執行緒正在修改你正在訪問的那個集合時,就會丟擲一個ConcurrentModification異常。 在java.util包下的都是快速失敗。 安全失敗:你在迭代的時候會去底層集合做一個拷貝,所以你在修改上層集合的時候是不會受影響的,不會丟擲ConcurrentModification異常。 在java.util.concurrent包下的全是安全失敗的。 26.Java中的HashMap的工作原理是什麼? 我們知道在Java中最常用的兩種結構是陣列和模擬指標(引用),幾乎所有的資料結構都可以利用這兩種來組合實現,HashMap也是如此。實際上HashMap是一個“連結串列雜湊”,如下是它資料結構:最左側是一個數組,陣列中的每一個元素都是一個連結串列,連結串列的每一個元素都是entry。 HashMap是基於hashing的原理,我們使用put(key, value)儲存物件到HashMap中,使用get(key)從HashMap中獲取物件。當我們給put()方法傳遞鍵和值時,我們先對鍵呼叫hashCode()方法,返回的hashCode用於找到bucket位置來儲存Entry物件。 27.當兩個物件的hashcode相同會發生什麼? 因為hashcode相同,所以它們的bucket位置相同,‘碰撞’會發生。因為HashMap使用連結串列儲存物件,這個Entry(包含有鍵值對的Map.Entry物件)會儲存在連結串列中。 28.如果兩個鍵的hashcode相同,你如何獲取值物件? 當我們呼叫get()方法,HashMap會使用鍵物件的hashcode找到bucket位置,然後會呼叫keys.equals()方法去找到連結串列中正確的節點,最終找到要找的值物件。 29.hashCode()和equals()方法有何重要性? HashMap使用Key物件的hashCode()和equals()方法去決定key-value對的索引。當我們試著從HashMap中獲取值的時候,這些方法也會被用到。如果這些方法沒有被正確地實現,在這種情況下,兩個不同Key也許會產生相同的hashCode()和equals()輸出,HashMap將會認為它們是相同的,然後覆蓋它們,而非把它們儲存到不同的地方。同樣的,所有不允許儲存重複資料的集合類都使用hashCode()和equals()去查詢重複,所以正確實現它們非常重要。equals()和hashCode()的實現應該遵循以下規則: (1)如果o1.equals(o2),那麼o1.hashCode() == o2.hashCode()總是為true的。 (2)如果o1.hashCode() == o2.hashCode(),並不意味著o1.equals(o2)會為true。 具體可以參考 http://blog.csdn.net/javazejian/article/details/51348320 30.HashMap和Hashtable有什麼區別? 1、HashMap是非執行緒安全的,HashTable是執行緒安全的。 2、HashMap的鍵和值都允許有null值存在,而HashTable則不行。 3、因為執行緒安全的問題,HashMap效率比HashTable的要高。 4、Hashtable是同步的,而HashMap不是。因此,HashMap更適合於單執行緒環境,而Hashtable適合於多執行緒環境。 一般現在不建議用HashTable, ①是HashTable是遺留類,內部實現很多沒優化和冗餘。②即使在多執行緒環境下,現在也有同步的ConcurrentHashMap替代,沒有必要因為是多執行緒而用HashTable。 31.如何決定選用HashMap還是TreeMap? 對於在Map中插入、刪除和定位元素這類操作,HashMap是最好的選擇。然而,假如你需要對一個有序的key集合進行遍歷,TreeMap是更好的選擇。基於你的collection的大小,也許向HashMap中新增元素會更快,將map換為TreeMap進行有序key的遍歷。 32.ArrayList和Vector有何異同點? ArrayList和Vector在很多時候都很類似。 (1)兩者都是基於索引的,內部由一個數組支援。 (2)兩者維護插入的順序,我們可以根據插入順序來獲取元素。 (3)ArrayList和Vector的迭代器實現都是fail-fast的。 (4)ArrayList和Vector兩者允許null值,也可以使用索引值對元素進行隨機訪問。 以下是ArrayList和Vector的不同點。 (1)Vector是同步的,而ArrayList不是。然而,如果你尋求在迭代的時候對列表進行改變,你應該使用CopyOnWriteArrayList。 (2)ArrayList比Vector快,它因為有同步,不會過載。 (3)ArrayList更加通用,因為我們可以使用Collections工具類輕易地獲取同步列表和只讀列表。 33.Array和ArrayList有何區別?什麼時候更適合用Array? Array可以容納基本型別和物件,而ArrayList只能容納物件。 Array是指定大小的,而ArrayList大小是固定的。 Array沒有提供ArrayList那麼多功能,比如addAll、removeAll和iterator等。儘管ArrayList明顯是更好的選擇,但也有些時候Array比較好用。 (1)如果列表的大小已經指定,大部分情況下是儲存和遍歷它們。 (2)對於遍歷基本資料型別,儘管Collections使用自動裝箱來減輕編碼任務,在指定大小的基本型別的列表上工作也會變得很慢。 (3)如果你要使用多維陣列,使用[][]比List