- java高級工程師面試題及答案 推薦度:
- 相關(guān)推薦
高級java工程師面試題
在高級的Java工程師看了,面試做好準(zhǔn)備很有必要,那么你了解面試題目了嗎?下面陽光網(wǎng)小編已經(jīng)為你們整理了高級java工程師面試題,希望可以幫到你。
高級java工程師面試題1
1)Java 中能創(chuàng)建 Volatile 數(shù)組嗎?
能,Java 中可以創(chuàng)建 volatile 類型數(shù)組,不過只是一個指向數(shù)組的引用,而不是整個數(shù)組。我的意思是,如果改變引用指向的數(shù)組,將會受到 volatile 的保護(hù),但是如果多個線程同時改變數(shù)組的元素,volatile 標(biāo)示符就不能起到之前的保護(hù)作用了。
2)volatile 能使得一個非原子操作變成原子操作嗎?
一個典型的例子是在類中有一個long 類型的成員變量。如果你知道該成員變量會被多個線程訪問,如計數(shù)器、價格等,你最好是將其設(shè)置為 volatile。為什么?因為 Java 中讀取 long 類型變量不是原子的,需要分成兩步,如果一個線程正在修改該 long 變量的值,另一個線程可能只能看到該值的一半(前 32 位)。但是對一個 volatile 型的 long 或 double 變量的讀寫是原子。
3)volatile 修飾符的有過什么實踐?
一種實踐是用 volatile 修飾 long 和 double 變量,使其能按原子類型來讀寫。double 和 long 都是64位寬,因此對這兩種類型的讀是分為兩部分的,第一次讀取第一個 32 位,然后再讀剩下的 32 位,這個過程不是原子的,但 Java 中 volatile 型的 long 或 double 變量的讀寫是原子的。volatile 修復(fù)符的另一個作用是提供內(nèi)存屏障(memory barrier),例如在分布式框架中的應(yīng)用。簡單的說,就是當(dāng)你寫一個 volatile 變量之前,Java 內(nèi)存模型會插入一個寫屏障(writebarrier),讀一個 volatile 變量之前,會插入一個讀屏障(read barrier)。意思就是說,在你寫一個 volatile 域時,能保證任何線程都能看到你寫的值,同時,在寫之前,也能保證任何數(shù)值的更新對所有線程是可見的,因為內(nèi)存屏障會將其他所有寫的值更新到緩存。
4)volatile 類型變量提供什么保證?
volatile 變量提供順序和可見性保證,例如,JVM或者 JIT為了獲得更好的性能會對語句重排序,但是 volatile類型變量即使在沒有同步塊的情況下賦值也不會與其他語句重排序。 volatile 提供 happens-before 的`保證,確保一個線程的修改能對其他線程是可見的。某些情況下,volatile 還能提供原子性,如讀 64 位數(shù)據(jù)類型,像 long 和 double 都不是原子的,但 volatile 類型的 double 和 long 就是原子的。
5) 10 個線程和 2 個線程的同步代碼,哪個更容易寫?
從寫代碼的角度來說,兩者的復(fù)雜度是相同的,因為同步代碼與線程數(shù)量是相互獨立的。但是同步策略的選擇依賴于線程的數(shù)量,因為越多的線程意味著更大的競爭,所以你需要利用同步技術(shù),如鎖分離,這要求更復(fù)雜的代碼和專業(yè)知識。
高級java工程師面試題2
1)哪個類包含 clone 方法?是 Cloneable 還是 Object?
java.lang.Cloneable 是一個標(biāo)示性接口,不包含任何方法,clone 方法在 object 類中定義。并且需要知道clone() 方法是一個本地方法,這意味著它是由 c 或 c++ 或 其他本地語言實現(xiàn)的。
2)Java 中 ++ 操作符是線程安全的嗎?
不是線程安全的操作。它涉及到多個指令,如讀取變量值,增加,然后存儲回內(nèi)存,這個過程可能會出現(xiàn)多個線程交差。
3)a = a + b 與 a += b 的區(qū)別
+= 隱式的將加操作的結(jié)果類型強(qiáng)制轉(zhuǎn)換為持有結(jié)果的`類型。如果兩這個整型相加,如 byte、short 或者 int,首先會將它們提升到 int 類型,然后在執(zhí)行加法操作。如果加法操作的結(jié)果比 a 的最大值要大,則 a+b 會出現(xiàn)編譯錯誤,但是 a += b 沒問題,如下:
byte a = 127;
byte b = 127;
b = a + b; // error : cannot convert from int to byte
b += a; // ok
(譯者注:這個地方應(yīng)該表述的有誤,其實無論 a+b的值為多少,編譯器都會報錯,因為 a+b 操作會將 a、b提升為 int 類型,所以將 int 類型賦值給 byte 就會編譯出錯)
4)我能在不進(jìn)行強(qiáng)制轉(zhuǎn)換的情況下將一個 double 值賦值給 long 類型的變量嗎?
不行,你不能在沒有強(qiáng)制類型轉(zhuǎn)換的前提下將一個 double 值賦值給 long 類型的變量,因為 double 類型的范圍比 long 類型更廣,所以必須要進(jìn)行強(qiáng)制轉(zhuǎn)換。
5)為什么 Java 中的 String 是不可變的(Immutable)?
Java 中的 String 不可變是因為 Java 的設(shè)計者認(rèn)為字符串使用非常頻繁,將字符串設(shè)置為不可變可以允許多個客戶端之間共享相同的字符串。
高級java工程師面試題3
1.Java的HashMap是如何工作的?
HashMap是一個針對數(shù)據(jù)結(jié)構(gòu)的鍵值,每個鍵都會有相應(yīng)的值,關(guān)鍵是識別這樣的值。
HashMap 基于 hashing 原理,我們通過 put ()和 get ()方法儲存和獲取對象。當(dāng)我們將鍵值對傳遞給 put ()方法時,它調(diào)用鍵對象的 hashCode ()方法來計算 hashcode,讓后找到 bucket 位置來儲存值對象。當(dāng)獲取對象時,通過鍵對象的 equals ()方法找到正確的鍵值對,然后返回值對象。HashMap 使用 LinkedList 來解決碰撞問題,當(dāng)發(fā)生碰撞了,對象將會儲存在 LinkedList 的下一個節(jié)點中。 HashMap 在每個 LinkedList 節(jié)點中儲存鍵值對對象。
2.什么是快速失敗的故障安全迭代器?
快速失敗的Java迭代器可能會引發(fā)ConcurrentModifcationException在底層集合迭代過程中被修改。故障安全作為發(fā)生在實例中的一個副本迭代是不會拋出任何異常的?焖偈〉墓收习踩独x了當(dāng)遭遇故障時系統(tǒng)是如何反應(yīng)的。例如,用于失敗的快速迭代器ArrayList和用于故障安全的迭代器ConcurrentHashMap。
3.Java BlockingQueue是什么?
Java BlockingQueue是一個并發(fā)集合util包的.一部分。BlockingQueue隊列是一種支持操作,它等待元素變得可用時來檢索,同樣等待空間可用時來存儲元素。
4.什么時候使用ConcurrentHashMap?
在問題2中我們看到ConcurrentHashMap被作為故障安全迭代器的一個實例,它允許完整的并發(fā)檢索和更新。當(dāng)有大量的并發(fā)更新時,ConcurrentHashMap此時可以被使用。這非常類似于Hashtable,但ConcurrentHashMap不鎖定整個表來提供并發(fā),所以從這點上ConcurrentHashMap的性能似乎更好一些。所以當(dāng)有大量更新時ConcurrentHashMap應(yīng)該被使用。
5.哪一個List實現(xiàn)了最快插入?
LinkedList和ArrayList是另個不同變量列表的實現(xiàn)。ArrayList的優(yōu)勢在于動態(tài)的增長數(shù)組,非常適合初始時總長度未知的情況下使用。LinkedList的優(yōu)勢在于在中間位置插入和刪除操作,速度是最快的。
LinkedList實現(xiàn)了List接口,允許null元素。此外LinkedList提供額外的get,remove,方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊列(queue)或雙向隊列(deque)。
ArrayList實現(xiàn)了可變大小的數(shù)組。它允許所有元素,包括null。 每個ArrayList實例都有一個容量(Capacity),即用于存儲元素的數(shù)組的大小。這個容量可隨著不斷添加新元素而自動增加,但是增長算法并沒有定義。當(dāng)需要插入大量元素時,在插入前可以調(diào)用ensureCapacity方法來增加ArrayList的容量以提高插入效率。
【高級java工程師面試題】相關(guān)文章:
java高級面試題04-06
高級java面試題及答案04-04
java高級面試題及答案04-06
java高級工程師面試題及答案04-05
java初級工程師面試題04-05
高級ios工程師面試題12-09
java軟件開發(fā)工程師面試題04-05
java軟件開發(fā)工程師面試題寶典04-05
.net高級工程師面試題11-26