Java基礎面試題,JavaWeb面試題
阿新 • • 發佈:2018-04-10
dex 強制轉換 定義 容器 所有 賦值 之間 初始 strings java基礎面試題
1、Java的基本類型(8個)每個基本類型所占位數與字節數
byte 1字節 8位
short 2字節 16位
int 4字節 32位
long 8字節 64位
char 2字節 16位
float 4字節 32位
double 8字節 64位
boolean 1字節 8位
2、Int與Integer區別
Integer是int的包裝類,int則是java的一種基本數據類型
Integer變量必須實例化後才能使用,而int變量不需要
Integer實際是對象的引用,當new一個Integer時,實際上是生成一個指針指向此對象;而int則是直接存儲數據值
Integer的默認值是null,int的默認值是0
3、Servlet生命周期
創建servlet實例
當servlet實例化後,將調用這個對象的init()方法進行初始化
再調用對象的service()方法來處理請求,並返回處理結果,在調用service之前,
需保證init初始化已被成功執行
當需要釋放servlet的時候,調用對象的destroy()方法來結束,並釋放資源
4、軟件開發流程
需求分析
概要設計
詳細設計
編碼
測試
軟件交付
驗收
維護
5、三層架構
UI(表現層):主要是指與用戶交互的界面。用於接收用戶輸入的數據和顯示處理後用戶需要的數據。
BLL:(業務邏輯層):UI層和DAL層之間的橋梁。實現業務邏輯。業務邏輯具體包含:驗證、計算、業務規則等等。
DAL:(數據訪問層):與數據庫打交道。主要實現對數據的增、刪、改、查。將存儲在數據庫中的數據提交給業務層,同時將業務層處理的數據保存到數據庫。(當然這些操作都是基於UI層的。用戶的需求反映給界面(UI),UI反映給BLL,BLL反映給DAL,DAL進行數據的操作,操作後再一一返回,直到將用戶所需數據反饋給用戶)
6、short s1 = 1; s1 = s1 + 1;有什麽錯? short s1 = 1; s1 += 1;有什麽錯?
對於 short s1 = 1; s1 = s1 + 1; 由於 s1+1 運算時會自動提升表達式的類型,所以結果
是 int 型,再賦值給 short 類型 s1 時,編譯器將報告需要強制轉換類型的錯誤。
對於 short s1 = 1; s1 += 1;由於 += 是 java 語言規定的運算符,java 編譯器會對它進行特殊處理,因此可以正確編譯。
7、下面這條語句一共創建了多少個對象:Strings="a"+"b"+"c"+"d";
String s = "a" +"b" + "c" + "d";
System.out.println(s =="abcd");
最終打印的結果應該為 true。
所以只創建一個對象 相當於直接定義了一個”abcd”的字
符串
8、try {}裏有一個 return 語句,那麽緊跟在這個 try 後的 finally {}裏的 code 會不會被執行,什麽時候被執行,在 return 前還是後?
一般答案:會執行,在方法返回調用前執行。準確的說是在return中間執行。 9、請寫出你最常見到的 5 個 runtimeexception。
轉換異常 ClassCastException
除零異常 ArithmeticException
空指針異常 NullPointerException
索引越界異常 StringIndexOutOfBoundsException
數組越界異常 ArrayIndexOutOfBoundsException
10、GC 是什麽? 為什麽要有 GC?
GC 是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java 提供的 GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java 語言沒有提供釋放已分配內存的顯示操作方法。
11、什麽時候用 assert
assertion(斷言)在軟件開發中是一種常用的調試方式,很多開發語言中都支持這種機制。在實現中,assertion 就是在程序中的一條語句,它對一個 boolean 表達式進行檢查,一個正確程序必須保證這個 boolean 表達式的值為 true;如果該值為 false,說明程序已經處於不正確的狀態下,assert 將給出警告或退出。一般來說,assertion用於保證程序最基本、關鍵的正確性。assertion 檢查通常在開發和測試時開啟。為了提高性能,在軟件發布後,assertion 檢查通常是關閉的。
12、java 中有幾種方法可以實現一個線程?用什麽關鍵字修飾同步方法? stop()和 suspend()方法為何不推薦使用?
有兩種實現方法,分別是繼承 Thread 類與實現 Runnable 接口
用 synchronized 關鍵字修飾同步方法
反對使用 stop(),是因為它不安全。它會解除由線程獲取的所有鎖定,而且如果對象
處於一種不連貫狀態,那麽其他線程能在那種狀態下檢查和修改它們。結果很難檢
查出真正的問題所在。suspend()方法容易發生死鎖。
調用 suspend()的時候,目標線程會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復運行。對任何線程來說,如果它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用
suspend(),
而應在自己的 Thread 類中置入一個標誌,指出線程應該活動還是掛起。
若標誌指出線程應該掛起,便用 wait()命其進入等待狀態。若標誌指出線程應當恢
復,則用一個 notify()重新啟動線程。
13、同步和異步有何異同,在什麽情況下分別使用他們?舉例說明。
如果數據將在線程間共享。例如正在寫的數據以後可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那麽這些數據就是共享數據,必須進行同步存取。
當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待方法的返回時,就應該使用異步編程,在很多情況下采用異步途徑往往更有效率。
14、當一個線程進入一個對象的一個 synchronized 方法後,其它線程是否可進入此對象的其它方法?
其他方法前是否加了 synchronized 關鍵字,如果沒加,則能。
如果這個方法內部調用了 wait,則可以進入其他 synchronized 方法。
如果其他個方法都加了 synchronized 關鍵字,並且內部沒有調用 wait,則不能。
如果其他方法是 static,它用的同步鎖是當前類的字節碼,與非靜態的方法不能同步,因為非靜態的方法用的是 this。
javaweb面試題
1、說一說 Servlet 的生命周期?
web 容器加載 servlet,生命周期開始。通過調用 servlet 的 init()方法進行 servlet 的初始化。通過調用 service()方法實現,根據請求的不同調用不同的 do***()方法。結束服務,web 容器調用 servlet 的 destroy()方法。
2、SERVLET API 中 forward() 與 redirect()的區別?
答:前者僅是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向後的地址;後者則是完全的跳轉,瀏覽器將會得到跳轉的地址,並重新發送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉後的鏈接地址。所以,前者更加高效,在前者可以滿足需要時,盡量使用 forward()方法,並且,這樣也有助於隱藏實際的鏈接。
在有些情況下,比如,需要跳轉到一個其它服務器上的資源,則必須使用
sendRedirect()方法。
3、 jsp 有哪些內置對象
request 用戶端請求,此請求會包含來自 GET/POST 請求的參數
response 網頁傳回用戶端的回應
pageContext 網頁的屬性是在這裏管理
session 與請求有關的會話期
application servlet 正在執行的內容
out 用來傳送回應的輸出
config servlet 的構架部件
page JSP 網頁本身
exception 針對錯誤網頁,未捕捉的例外
4、JSP 和 Servlet 有哪些相同點和不同點,他們之間的聯系是什麽?
JSP 是 Servlet 技術的擴展,本質上是 Servlet 的簡易方式,更強調應用的外表表達。
JSP 編譯後是"類 servlet"。Servlet 和 JSP 最主要的不同點在於,Servlet 的應用邏輯是 在 Java 文件中,並且完全從表示層中的 HTML 裏分離開來。而 JSP 的情況是 Java 和HTML 可以組合成一個擴展名為.jsp 的文件。JSP 側重於視圖,Servlet 主要用於控制邏輯。
5、MVC 的各個部分都有那些技術來實現?如何實現?
MVC 是 Model-View-Controller 的簡寫。Model 代表的是應用的業務邏輯(通過JavaBean,EJB 組件實現), View 是應用的表示面(由 JSP 頁面產生),Controller 是提供應用的處理過程控制(一般是一個 Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。
6、MVC 的各個部分都有那些技術來實現?如何實現?
MVC 是 Model-View-Controller 的簡寫。Model 代表的是應用的業務邏輯(通過JavaBean,EJB 組件實現), View 是應用的表示面(由 JSP 頁面產生),Controller 是提供應用的處理過程控制(一般是一個 Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。
7、Tomcat 的優化經驗
答:去掉對 web.xml 的監視,把 jsp 提前編輯成 Servlet。
有富余物理內存的情況,加大 tomcat 使用的 jvm 的內存
1.Java的HashMap是如何工作的?
HashMap是一個針對數據結構的鍵值,每個鍵都會有相應的值,關鍵是識別這樣的值。
HashMap 基於 hashing 原理,我們通過 put ()和 get ()方法儲存和獲取對象。當我們將鍵值對傳遞給 put ()方法時,它調用鍵對象的 hashCode ()方法來計算 hashcode,讓後找到 bucket 位置來儲存值對象。當獲取對象時,通過鍵對象的 equals ()方法找到正確的鍵值對,然後返回值對象。HashMap 使用 LinkedList 來解決碰撞問題,當發生碰撞了,對象將會儲存在 LinkedList 的下一個節點中。 HashMap 在每個 LinkedList 節點中儲存鍵值對對象。
2.什麽是快速失敗的故障安全叠代器?
快速失敗的Java叠代器可能會引發ConcurrentModifcationException在底層集合叠代過程中被修改。故障安全作為發生在實例中的一個副本叠代是不會拋出任何異常的。快速失敗的故障安全範例定義了當遭遇故障時系統是如何反應的。例如,用於失敗的快速叠代器ArrayList和用於故障安全的叠代器ConcurrentHashMap。
3.Java BlockingQueue是什麽?
Java BlockingQueue是一個並發集合util包的一部分。BlockingQueue隊列是一種支持操作,它等待元素變得可用時來檢索,同樣等待空間可用時來存儲元素。
4.什麽時候使用ConcurrentHashMap?
在問題2中我們看到ConcurrentHashMap被作為故障安全叠代器的一個實例,它允許完整的並發檢索和更新。當有大量的並發更新時,ConcurrentHashMap此時可以被使用。這非常類似於Hashtable,但ConcurrentHashMap不鎖定整個表來提供並發,所以從這點上ConcurrentHashMap的性能似乎更好一些。所以當有大量更新時ConcurrentHashMap應該被使用。
5.哪一個List實現了最快插入?
LinkedList和ArrayList是另個不同變量列表的實現。ArrayList的優勢在於動態的增長數組,非常適合初始時總長度未知的情況下使用。LinkedList的優勢在於在中間位置插入和刪除操作,速度是最快的。
LinkedList實現了List接口,允許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊列(queue)或雙向隊列(deque)。
ArrayList實現了可變大小的數組。它允許所有元素,包括null。 每個ArrayList實例都有一個容量(Capacity),即用於存儲元素的數組的大小。這個容量可隨著不斷添加新元素而自動增加,但是增長算法並沒有定義。當需要插入大量元素時,在插入前可以調用ensureCapacity方法來增加ArrayList的容量以提高插入效率。
6.Iterator和ListIterator的區別
ListIterator有add()方法,可以向List中添加對象,而Iterator不能。
ListIterator和Iterator都有hasNext()和next()方法,可以實現順序向後遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實現逆向(順序向前)遍歷。Iterator就不可以。
ListIterator可以定位當前的索引位置,nextIndex()和previousIndex()可以實現。Iterator沒有此功能。
都可實現刪除對象,但是ListIterator可以實現對象的修改,set()方法可以實現。Iierator僅能遍歷,不能修改。
7.什麽是CopyOnWriteArrayList,它與ArrayList有何不同?
CopyOnWriteArrayList是ArrayList的一個線程安全的變體,其中所有可變操作(add、set等等)都是通過對底層數組進行一次新的復制來實現的。相比較於ArrayList它的寫操作要慢一些,因為它需要實例的快照。
CopyOnWriteArrayList中寫操作需要大面積復制數組,所以性能肯定很差,但是讀操作因為操作的對象和寫操作不是同一個對象,讀之間也不需要加鎖,讀和寫之間的同步處理只是在寫完後通過一個簡單的"="將引用指向新的數組對象上來,這個幾乎不需要時間,這樣讀操作就很快很安全,適合在多線程裏使用,絕對不會發生ConcurrentModificationException ,因此CopyOnWriteArrayList適合使用在讀操作遠遠大於寫操作的場景裏,比如緩存。
8.叠代器和枚舉之間的區別
如果面試官問這個問題,那麽他的意圖一定是讓你區分Iterator不同於Enumeration的兩個方面:
Iterator允許移除從底層集合的元素。
Iterator的方法名是標準化的。
9.Hashmap如何同步?
當我們需要一個同步的HashMap時,有兩種選擇:
使用Collections.synchronizedMap(..)來同步HashMap。
使用ConcurrentHashMap的
這兩個選項之間的首選是使用ConcurrentHashMap,這是因為我們不需要鎖定整個對象,以及通過ConcurrentHashMap分區地圖來獲得鎖。
10.IdentityHashMap和HashMap的區別
IdentityHashMap是Map接口的實現。不同於HashMap的,這裏采用參考平等。
在HashMap中如果兩個元素是相等的,則key1.equals(key2)
在IdentityHashMap中如果兩個元素是相等的,則key1 == key2
1、Java的基本類型(8個)每個基本類型所占位數與字節數
byte 1字節 8位
short 2字節 16位
int 4字節 32位
long 8字節 64位
char 2字節 16位
float 4字節 32位
double 8字節 64位
boolean 1字節 8位
2、Int與Integer區別
Integer是int的包裝類,int則是java的一種基本數據類型
Integer變量必須實例化後才能使用,而int變量不需要
Integer實際是對象的引用,當new一個Integer時,實際上是生成一個指針指向此對象;而int則是直接存儲數據值
Integer的默認值是null,int的默認值是0
3、Servlet生命周期
創建servlet實例
當servlet實例化後,將調用這個對象的init()方法進行初始化
再調用對象的service()方法來處理請求,並返回處理結果,在調用service之前,
需保證init初始化已被成功執行
當需要釋放servlet的時候,調用對象的destroy()方法來結束,並釋放資源
4、軟件開發流程
需求分析
概要設計
詳細設計
編碼
測試
軟件交付
驗收
維護
5、三層架構
UI(表現層):主要是指與用戶交互的界面。用於接收用戶輸入的數據和顯示處理後用戶需要的數據。
BLL:(業務邏輯層):UI層和DAL層之間的橋梁。實現業務邏輯。業務邏輯具體包含:驗證、計算、業務規則等等。
DAL:(數據訪問層):與數據庫打交道。主要實現對數據的增、刪、改、查。將存儲在數據庫中的數據提交給業務層,同時將業務層處理的數據保存到數據庫。(當然這些操作都是基於UI層的。用戶的需求反映給界面(UI),UI反映給BLL,BLL反映給DAL,DAL進行數據的操作,操作後再一一返回,直到將用戶所需數據反饋給用戶)
6、short s1 = 1; s1 = s1 + 1;有什麽錯? short s1 = 1; s1 += 1;有什麽錯?
對於 short s1 = 1; s1 = s1 + 1; 由於 s1+1 運算時會自動提升表達式的類型,所以結果
是 int 型,再賦值給 short 類型 s1 時,編譯器將報告需要強制轉換類型的錯誤。
對於 short s1 = 1; s1 += 1;由於 += 是 java 語言規定的運算符,java 編譯器會對它進行特殊處理,因此可以正確編譯。
7、下面這條語句一共創建了多少個對象:Strings="a"+"b"+"c"+"d";
String s = "a" +"b" + "c" + "d";
System.out.println(s =="abcd");
最終打印的結果應該為 true。
所以只創建一個對象 相當於直接定義了一個”abcd”的字
符串
8、try {}裏有一個 return 語句,那麽緊跟在這個 try 後的 finally {}裏的 code 會不會被執行,什麽時候被執行,在 return 前還是後?
一般答案:會執行,在方法返回調用前執行。準確的說是在return中間執行。 9、請寫出你最常見到的 5 個 runtimeexception。
轉換異常 ClassCastException
除零異常 ArithmeticException
空指針異常 NullPointerException
索引越界異常 StringIndexOutOfBoundsException
數組越界異常 ArrayIndexOutOfBoundsException
10、GC 是什麽? 為什麽要有 GC?
GC 是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java 提供的 GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java 語言沒有提供釋放已分配內存的顯示操作方法。
11、什麽時候用 assert
assertion(斷言)在軟件開發中是一種常用的調試方式,很多開發語言中都支持這種機制。在實現中,assertion 就是在程序中的一條語句,它對一個 boolean 表達式進行檢查,一個正確程序必須保證這個 boolean 表達式的值為 true;如果該值為 false,說明程序已經處於不正確的狀態下,assert 將給出警告或退出。一般來說,assertion用於保證程序最基本、關鍵的正確性。assertion 檢查通常在開發和測試時開啟。為了提高性能,在軟件發布後,assertion 檢查通常是關閉的。
12、java 中有幾種方法可以實現一個線程?用什麽關鍵字修飾同步方法? stop()和 suspend()方法為何不推薦使用?
有兩種實現方法,分別是繼承 Thread 類與實現 Runnable 接口
用 synchronized 關鍵字修飾同步方法
反對使用 stop(),是因為它不安全。它會解除由線程獲取的所有鎖定,而且如果對象
處於一種不連貫狀態,那麽其他線程能在那種狀態下檢查和修改它們。結果很難檢
查出真正的問題所在。suspend()方法容易發生死鎖。
調用 suspend()的時候,目標線程會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復運行。對任何線程來說,如果它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用
suspend(),
而應在自己的 Thread 類中置入一個標誌,指出線程應該活動還是掛起。
若標誌指出線程應該掛起,便用 wait()命其進入等待狀態。若標誌指出線程應當恢
復,則用一個 notify()重新啟動線程。
13、同步和異步有何異同,在什麽情況下分別使用他們?舉例說明。
如果數據將在線程間共享。例如正在寫的數據以後可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那麽這些數據就是共享數據,必須進行同步存取。
當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待方法的返回時,就應該使用異步編程,在很多情況下采用異步途徑往往更有效率。
14、當一個線程進入一個對象的一個 synchronized 方法後,其它線程是否可進入此對象的其它方法?
其他方法前是否加了 synchronized 關鍵字,如果沒加,則能。
如果這個方法內部調用了 wait,則可以進入其他 synchronized 方法。
如果其他個方法都加了 synchronized 關鍵字,並且內部沒有調用 wait,則不能。
如果其他方法是 static,它用的同步鎖是當前類的字節碼,與非靜態的方法不能同步,因為非靜態的方法用的是 this。
javaweb面試題
1、說一說 Servlet 的生命周期?
web 容器加載 servlet,生命周期開始。通過調用 servlet 的 init()方法進行 servlet 的初始化。通過調用 service()方法實現,根據請求的不同調用不同的 do***()方法。結束服務,web 容器調用 servlet 的 destroy()方法。
2、SERVLET API 中 forward() 與 redirect()的區別?
答:前者僅是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向後的地址;後者則是完全的跳轉,瀏覽器將會得到跳轉的地址,並重新發送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉後的鏈接地址。所以,前者更加高效,在前者可以滿足需要時,盡量使用 forward()方法,並且,這樣也有助於隱藏實際的鏈接。
在有些情況下,比如,需要跳轉到一個其它服務器上的資源,則必須使用
sendRedirect()方法。
3、 jsp 有哪些內置對象
request 用戶端請求,此請求會包含來自 GET/POST 請求的參數
response 網頁傳回用戶端的回應
pageContext 網頁的屬性是在這裏管理
session 與請求有關的會話期
application servlet 正在執行的內容
out 用來傳送回應的輸出
config servlet 的構架部件
page JSP 網頁本身
exception 針對錯誤網頁,未捕捉的例外
4、JSP 和 Servlet 有哪些相同點和不同點,他們之間的聯系是什麽?
JSP 是 Servlet 技術的擴展,本質上是 Servlet 的簡易方式,更強調應用的外表表達。
JSP 編譯後是"類 servlet"。Servlet 和 JSP 最主要的不同點在於,Servlet 的應用邏輯是 在 Java 文件中,並且完全從表示層中的 HTML 裏分離開來。而 JSP 的情況是 Java 和HTML 可以組合成一個擴展名為.jsp 的文件。JSP 側重於視圖,Servlet 主要用於控制邏輯。
5、MVC 的各個部分都有那些技術來實現?如何實現?
MVC 是 Model-View-Controller 的簡寫。Model 代表的是應用的業務邏輯(通過JavaBean,EJB 組件實現), View 是應用的表示面(由 JSP 頁面產生),Controller 是提供應用的處理過程控制(一般是一個 Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。
6、MVC 的各個部分都有那些技術來實現?如何實現?
MVC 是 Model-View-Controller 的簡寫。Model 代表的是應用的業務邏輯(通過JavaBean,EJB 組件實現), View 是應用的表示面(由 JSP 頁面產生),Controller 是提供應用的處理過程控制(一般是一個 Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。
7、Tomcat 的優化經驗
答:去掉對 web.xml 的監視,把 jsp 提前編輯成 Servlet。
有富余物理內存的情況,加大 tomcat 使用的 jvm 的內存
1.Java的HashMap是如何工作的?
HashMap是一個針對數據結構的鍵值,每個鍵都會有相應的值,關鍵是識別這樣的值。
HashMap 基於 hashing 原理,我們通過 put ()和 get ()方法儲存和獲取對象。當我們將鍵值對傳遞給 put ()方法時,它調用鍵對象的 hashCode ()方法來計算 hashcode,讓後找到 bucket 位置來儲存值對象。當獲取對象時,通過鍵對象的 equals ()方法找到正確的鍵值對,然後返回值對象。HashMap 使用 LinkedList 來解決碰撞問題,當發生碰撞了,對象將會儲存在 LinkedList 的下一個節點中。 HashMap 在每個 LinkedList 節點中儲存鍵值對對象。
2.什麽是快速失敗的故障安全叠代器?
快速失敗的Java叠代器可能會引發ConcurrentModifcationException在底層集合叠代過程中被修改。故障安全作為發生在實例中的一個副本叠代是不會拋出任何異常的。快速失敗的故障安全範例定義了當遭遇故障時系統是如何反應的。例如,用於失敗的快速叠代器ArrayList和用於故障安全的叠代器ConcurrentHashMap。
3.Java BlockingQueue是什麽?
Java BlockingQueue是一個並發集合util包的一部分。BlockingQueue隊列是一種支持操作,它等待元素變得可用時來檢索,同樣等待空間可用時來存儲元素。
4.什麽時候使用ConcurrentHashMap?
在問題2中我們看到ConcurrentHashMap被作為故障安全叠代器的一個實例,它允許完整的並發檢索和更新。當有大量的並發更新時,ConcurrentHashMap此時可以被使用。這非常類似於Hashtable,但ConcurrentHashMap不鎖定整個表來提供並發,所以從這點上ConcurrentHashMap的性能似乎更好一些。所以當有大量更新時ConcurrentHashMap應該被使用。
5.哪一個List實現了最快插入?
LinkedList和ArrayList是另個不同變量列表的實現。ArrayList的優勢在於動態的增長數組,非常適合初始時總長度未知的情況下使用。LinkedList的優勢在於在中間位置插入和刪除操作,速度是最快的。
LinkedList實現了List接口,允許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊列(queue)或雙向隊列(deque)。
ArrayList實現了可變大小的數組。它允許所有元素,包括null。 每個ArrayList實例都有一個容量(Capacity),即用於存儲元素的數組的大小。這個容量可隨著不斷添加新元素而自動增加,但是增長算法並沒有定義。當需要插入大量元素時,在插入前可以調用ensureCapacity方法來增加ArrayList的容量以提高插入效率。
6.Iterator和ListIterator的區別
ListIterator有add()方法,可以向List中添加對象,而Iterator不能。
ListIterator和Iterator都有hasNext()和next()方法,可以實現順序向後遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實現逆向(順序向前)遍歷。Iterator就不可以。
ListIterator可以定位當前的索引位置,nextIndex()和previousIndex()可以實現。Iterator沒有此功能。
都可實現刪除對象,但是ListIterator可以實現對象的修改,set()方法可以實現。Iierator僅能遍歷,不能修改。
7.什麽是CopyOnWriteArrayList,它與ArrayList有何不同?
CopyOnWriteArrayList是ArrayList的一個線程安全的變體,其中所有可變操作(add、set等等)都是通過對底層數組進行一次新的復制來實現的。相比較於ArrayList它的寫操作要慢一些,因為它需要實例的快照。
CopyOnWriteArrayList中寫操作需要大面積復制數組,所以性能肯定很差,但是讀操作因為操作的對象和寫操作不是同一個對象,讀之間也不需要加鎖,讀和寫之間的同步處理只是在寫完後通過一個簡單的"="將引用指向新的數組對象上來,這個幾乎不需要時間,這樣讀操作就很快很安全,適合在多線程裏使用,絕對不會發生ConcurrentModificationException ,因此CopyOnWriteArrayList適合使用在讀操作遠遠大於寫操作的場景裏,比如緩存。
8.叠代器和枚舉之間的區別
如果面試官問這個問題,那麽他的意圖一定是讓你區分Iterator不同於Enumeration的兩個方面:
Iterator允許移除從底層集合的元素。
Iterator的方法名是標準化的。
9.Hashmap如何同步?
當我們需要一個同步的HashMap時,有兩種選擇:
使用Collections.synchronizedMap(..)來同步HashMap。
使用ConcurrentHashMap的
這兩個選項之間的首選是使用ConcurrentHashMap,這是因為我們不需要鎖定整個對象,以及通過ConcurrentHashMap分區地圖來獲得鎖。
10.IdentityHashMap和HashMap的區別
IdentityHashMap是Map接口的實現。不同於HashMap的,這裏采用參考平等。
在HashMap中如果兩個元素是相等的,則key1.equals(key2)
在IdentityHashMap中如果兩個元素是相等的,則key1 == key2
Java基礎面試題,JavaWeb面試題