六月丁香五月婷婷,丁香五月婷婷网,欧美激情网站,日本护士xxxx,禁止18岁天天操夜夜操,18岁禁止1000免费,国产福利无码一区色费

學(xué)習(xí)啦 > 創(chuàng)業(yè)指南 > 職場 > 面試題 > 2016年java面試題

2016年java面試題

時間: 如英753 分享

2016年java面試題

  Java語言具有的面向?qū)ο?、跨平臺、語言級并發(fā)支持、安全等特性,下面是學(xué)習(xí)啦小編為大家?guī)淼?016年java面試題,相信對你會有幫助的。

  2016年java面試題之多線程、并發(fā)及線程

  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)存模型會插入一個寫屏障(write barrier),讀一個 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)你是如何調(diào)用 wait()方法的?使用 if 塊還是循環(huán)?為什么?

  wait() 方法應(yīng)該在循環(huán)調(diào)用,因為當(dāng)線程獲取到 CPU 開始執(zhí)行的時候,其他條件可能還沒有滿足,所以在處理前,循環(huán)檢測條件是否滿足會更好。下面是一段標(biāo)準(zhǔn)的使用 wait 和 notify 方法的代碼:

  // The standard idiom for using the wait method

  synchronized (obj) {

  while (condition does not hold)

  obj.wait(); // (Releases lock, and reacquires on wakeup)

  ... // Perform action appropriate to condition

  }

  6)什么是多線程環(huán)境下的偽共享(false sharing)?

  偽共享是多線程系統(tǒng)(每個處理器有自己的局部緩存)中一個眾所周知的性能問題。偽共享發(fā)生在不同處理器的上的線程對變量的修改依賴于相同的緩存行

  7)什么是 Busy spin?我們?yōu)槭裁匆褂盟?

  Busy spin 是一種在不釋放 CPU 的基礎(chǔ)上等待事件的技術(shù)。它經(jīng)常用于避免丟失 CPU 緩存中的數(shù)據(jù)(如果線程先暫停,之后在其他CPU上運行就會丟失)。所以,如果你的工作要求低延遲,并且你的線程目前沒有任何順序,這樣你就可以通過循環(huán)檢測隊列中的新消息來代替調(diào)用 sleep() 或 wait() 方法。它唯一的好處就是你只需等待很短的時間,如幾微秒或幾納秒。LMAX 分布式框架是一個高性能線程間通信的庫,該庫有一個 BusySpinWaitStrategy 類就是基于這個概念實現(xiàn)的,使用 busy spin 循環(huán) EventProcessors 等待屏障。

  8)什么是線程局部變量?

  線程局部變量是局限于線程內(nèi)部的變量,屬于線程自身所有,不在多個線程間共享。Java 提供 ThreadLocal 類來支持線程局部變量,是一種實現(xiàn)線程安全的方式。但是在管理環(huán)境下(如 web 服務(wù)器)使用線程局部變量的時候要特別小心,在這種情況下,工作線程的生命周期比任何應(yīng)用變量的生命周期都要長。任何線程局部變量一旦在工作完成后沒有釋放,Java 應(yīng)用就存在內(nèi)存泄露的風(fēng)險。

  9)Java 中 sleep 方法和 wait 方法的區(qū)別?

  雖然兩者都是用來暫停當(dāng)前運行的線程,但是 sleep() 實際上只是短暫停頓,因為它不會釋放鎖,而 wait() 意味著條件等待,這就是為什么該方法要釋放鎖,因為只有這樣,其他等待的線程才能在滿足條件時獲取到該鎖。

  10)什么是不可變對象(immutable object)?Java 中怎么創(chuàng)建一個不可變對象?

  不可變對象指對象一旦被創(chuàng)建,狀態(tài)就不能再改變。任何修改都會創(chuàng)建一個新的對象,如 String、Integer及其它包裝類。

  11)我們能創(chuàng)建一個包含可變對象的不可變對象嗎?

  是的,我們是可以創(chuàng)建一個包含可變對象的不可變對象的,你只需要謹(jǐn)慎一點,不要共享可變對象的引用就可以了,如果需要變化時,就返回原對象的一個拷貝。最常見的例子就是對象中包含一個日期對象的引用。

  2016年java面試題之?dāng)?shù)據(jù)類型和 Java

  12)Java 中應(yīng)該使用什么數(shù)據(jù)類型來代表價格?

  如果不是特別關(guān)心內(nèi)存和性能的話,使用BigDecimal,否則使用預(yù)定義精度的 double 類型。

  13)怎么將 byte 轉(zhuǎn)換為 String?

  可以使用 String 接收 byte[] 參數(shù)的構(gòu)造器來進(jìn)行轉(zhuǎn)換,需要注意的點是要使用的正確的編碼,否則會使用平臺默認(rèn)編碼,這個編碼可能跟原來的編碼相同,也可能不同。

  14)我們能將 int 強(qiáng)制轉(zhuǎn)換為 byte 類型的變量嗎?如果該值大于 byte 類型的范圍,將會出現(xiàn)什么現(xiàn)象?

  是的,我們可以做強(qiáng)制轉(zhuǎn)換,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,如果強(qiáng)制轉(zhuǎn)化是,int 類型的高 24 位將會被丟棄,byte 類型的范圍是從 -128 到 128。

  15)Java 中 操作符是線程安全的嗎?

  不是線程安全的操作。它涉及到多個指令,如讀取變量值,增加,然后存儲回內(nèi)存,這個過程可能會出現(xiàn)多個線程交差。

  16)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

  注:其實無論 a b 的值為多少,編譯器都會報錯,因為 a b 操作會將 a、b 提升為 int 類型,所以將 int 類型賦值給 byte 就會編譯出錯

  17)我能在不進(jìn)行強(qiáng)制轉(zhuǎn)換的情況下將一個 double 值賦值給 long 類型的變量嗎?

  不行,你不能在沒有強(qiáng)制類型轉(zhuǎn)換的前提下將一個 double 值賦值給 long 類型的變量,因為 double 類型的范圍比 long 類型更廣,所以必須要進(jìn)行強(qiáng)制轉(zhuǎn)換。

  18)3*0.1 == 0.3 將會返回什么?true 還是 false?

  false,因為有些浮點數(shù)不能完全精確的表示出來。

  19)int 和 Integer 哪個會占用更多的內(nèi)存?

  Integer 對象會占用更多的內(nèi)存。Integer 是一個對象,需要存儲對象的元數(shù)據(jù)。但是 int 是一個原始類型的數(shù)據(jù),所以占用的空間更少。

  20)為什么 Java 中的 String 是不可變的(Immutable)?

  Java 中的 String 不可變是因為 Java 的設(shè)計者認(rèn)為字符串使用非常頻繁,將字符串設(shè)置為不可變可以允許多個客戶端之間共享相同的字符串。

  21)Java 中的構(gòu)造器鏈?zhǔn)鞘裁?

  當(dāng)你從一個構(gòu)造器中調(diào)用另一個構(gòu)造器,就是Java 中的構(gòu)造器鏈。這種情況只在重載了類的構(gòu)造器的時候才會出現(xiàn)。

1082585