java面試經典題目
Java面試中有哪些經典面試題呢?對Java技術員來說,提前做好準備很重要,以下是小編幫你們整理的java面試經典題目,一起來學習啦。
java面試經典題目篇一
1、作用域public,private,protected,以及不寫時的區別
答:區別如下:
作用域 當前類 同一package 子孫類 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
不寫時默認為friendly
2、ArrayList和Vector的區別,HashMap和Hashtable的區別
答:就ArrayList與Vector主要從二方面來說.
一.同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的
二.數據增長:當需要增長時,Vector默認增長為原來一培,而ArrayList卻是原來的一半就HashMap與HashTable主要從三方面來說。
一.歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現
二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的
三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value
3、char型變量中能不能存貯一個中文漢字?為什么?
答:是能夠定義成為一個中文的,因為java中以unicode編碼,一個char占16個字節,所以放一個中文是沒問題的
4、多線程有幾種實現方法,都是什么?同步有幾種實現方法,都是什么?
答:多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口 同步的實現方面有兩種,分別是synchronized,wait與notify
5、垃圾回收機制,如何優化程序?
希望大家補上,謝謝
6、float型float f=3.4是否正確?
答:不正確。精度不準確,應該用強制類型轉換,如下所示:float f=(float)3.4
7、介紹JAVA中的Collection FrameWork(包括如何寫自己的數據結構)? 答:Collection FrameWork如下:
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
java面試經典題目篇二
1.Java的HashMap是如何工作的?
HashMap是一個針對數據結構的鍵值,每個鍵都會有相應的值,關鍵是識別這樣的值。
HashMap 基于 hashing 原理,我們通過 put ()和 get ()方法儲存和獲取對象。當我們將鍵值對傳遞給 put ()方法時,它調用鍵對象的 hashCode ()方法來計算 hashcode,讓后找到 bucket 位置來儲存值對象。當獲取對象時,通過鍵對象的 equals ()方法找到正確的鍵值對,然后返回值對象。HashMap 使用 LinkedList 來解決碰撞問題,當發生碰撞了,對象將會儲存在 LinkedList 的下一個節點中。 HashMap 在每個 LinkedList 節點中儲存鍵值對對象。
2.什么是快速失敗的故障安全迭代器?
快速失敗的Java迭代器可能會引發ConcurrentModifcationException在底層集合迭代過程中被修改。故障安全作為發生在實例中的一個副本迭代是不會拋出任何異常的??焖偈〉墓收习踩独x了當遭遇故障時系統是如何反應的。例如,用于失敗的快速迭代器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面試經典題目篇三
1什么是線程局部變量?
線程局部變量是局限于線程內部的變量,屬于線程自身所有,不在多個線程間共享。Java 提供 ThreadLocal 類來支持線程局部變量,是一種實現線程安全的方式。但是在管理環境下(如 web 服務器)使用線程局部變量的時候要特別小心,在這種情況下,工作線程的生命周期比任何應用變量的生命周期都要長。任何線程局部變量一旦在工作完成后沒有釋放,Java 應用就存在內存泄露的風險。
2用 wait-notify 寫一段代碼來解決生產者-消費者問題?
只要記住在同步塊中調用 wait() 和 notify()方法,如果阻塞,通過循環來測試等待條件。
3用 Java 寫一個線程安全的單例模式(Singleton)?
當我們說線程安全時,意思是即使初始化是在多線程環境中,仍然能保證單個實例。Java 中,使用枚舉作為單例類是最簡單的方式來創建線程安全單例模式的方式。
4Java 中 sleep 方法和 wait 方法的區別?
雖然兩者都是用來暫停當前運行的線程,但是 sleep() 實際上只是短暫停頓,因為它不會釋放鎖,而 wait() 意味著條件等待,這就是為什么該方法要釋放鎖,因為只有這樣,其他等待的線程才能在滿足條件時獲取到該鎖。
5什么是不可變對象(immutable object)?Java 中怎么創建一個不可變對象?
不可變對象指對象一旦被創建,狀態就不能再改變。任何修改都會創建一個新的對象,如 String、Integer及其它包裝類。詳情參見答案,一步一步指導你在 Java 中創建一個不可變的類。
6我們能創建一個包含可變對象的不可變對象嗎?
是的,我們是可以創建一個包含可變對象的不可變對象的,你只需要謹慎一點,不要共享可變對象的引用就可以了,如果需要變化時,就返回原對象的一個拷貝。最常見的例子就是對象中包含一個日期對象的引用。
看了“java面試經典題目”的人還看過:
1.
2.
3.
4.
5.