【Java基礎】常用知識積累(一),java基礎知識積累

來源:互聯網
上載者:User

【Java基礎】常用知識積累(一),java基礎知識積累

1、==和equals的區別 null和""的區別

2、15個頂級Java多線程面試題及回答

        (1)、線程中join的使用

       在很多情況下,主線程產生並起動了子線程,如果子線程裡要進行大量的耗時的運算,主線程往往將於子線程之前結束,但是如果主線程處理完其他的事務後,需要用到子線程的處理結果,也就是主線程需要等待子線程執行完成之後再結束,這個時候就要用到join()方法了。

     (2)、線程中synchronized 與 Lock 的那點事

     (3)、線程中死結問題

        (4)、在java中wait和sleep方法的不同?
      通常會在電話面試中經常被問到的Java線程面試問題。最大的不同是在等待時wait會釋放鎖,而sleep一直持有鎖。Wait通常被用於線程間互動,sleep通常被用於暫停執行。

      (5)、Java多線程原子操作

        SerialNumberGenerator大概是你能想到的最簡單的例子了。如果你是從C++轉過來的,或者有其它低級語言的經驗,你會認為遞增肯定是一個原子操作,因為它通常都是用CPU的指令來實現的。但是在JVM裡,遞增不是原子操作,它涉及到了讀和寫。所以即便是這麼簡單的一個操作,多線程也有機可乘。

         

public class SerialNumberGenerator {private static volatile int serialNumber = 0;public static int nextSerialNumber() {return serialNumber++;}}

        serialNumber欄位是volatile的,這樣所有線程的serialNumber欄位值保持一致。
        多線程工作中有主記憶體和工作記憶體之分,在JVM中有一個主記憶體,專門負責所有線程共用資料;而每個線程都有它自己私人的工作記憶體,volatile變數表示保證它必須是與主記憶體保持一致,它實際是變數的同步

3、為什麼說Java的String對象是不可變的

     根據JDK中java.lang.String的源碼進行分析,從中可以得出String類型的對象不可變的原因,大致上有如下兩個:
     (1)、java.lang.String類型在實現時,其內部成員變數全部使用final來修飾,保證成員變數的引用值只能通過建構函式來修改;
     (2)、java.lang.String類型在實現時,在外部可能修改其內部儲存值的函數實現中,返回時一律構造新的String對象或者新的byte數組或者char數組;
        第2的重要性在於,假如通過String類型的toCharArray方法可以直接存取String類型內部定義的char數組,那麼即便String類型內部的char數組使用了final來修飾,也僅僅保證這個成員變數的引用不可變,而無法保證引用指向的記憶體地區不可變。由上述兩點,保證外部不可能修改java.lang.String類型對象的內部屬性,從而保證String對象是不可變的。

4、StringBuffer和StringBuilder

       提到String,就不得不提一下JDK中存在另外兩個常用來表示字串的類,StringBuffer和StringBuilder。根據注釋,StringBuffer可謂老資格了,從JDK1.0時即伴隨Java征戰世界,而StringBuilder直到JDK1.5時才出現。

StringBuffer和StringBuilder的共同點:
 (1)、都是可變對象,對象內的字元緩衝會隨著拼接操作而動態擴充;
 (2)、用來完成字串拼接操作;
 (3)、構造時傳入內部緩衝大小時,可以降低緩衝擴充的次數,明顯提升字串拼接操作的效率;
StringBuffer和StringBuilder的區別:
 (1)、StringBuilder的方法都是線程不安全的,從另外一個角度講,StringBuilder類型的對象在做字串拼接操作時,由於少了線程同步的操作,執行效率上有很大提升;
 (2)、StringBuffer的方法都加上了synchronized關鍵字,因而在一定的情境下,StringBuffer類型的對象都是安全執行緒的,但在執行效率上,由於多了線程同步的操作,因而會有少許的損失;
   在大多數情境下,字串拼接操作都是不需要考慮多線程環境下對結果的影響的,因而使用StringBuilder類型可以提升代碼的執行效率。
   在多個線程的代碼中共用同一個StringBuffer類型的對象時,需要關注synchronized關鍵字對最終結果的影響。由於StringBuffer類的實現中,僅僅對每個方法使用了synchronized修飾,這隻能保證在多線程情境下,訪問StringBuffer對象的同一個方法時可以保證最終結果的一致性,假如一個線程訪問A方法,另外一個線程方法B方法,則由於加鎖對象的不同,可能會出現不一致的現象,這是需要程式員特別要注意的地方。類似的,可以參考Vector的實現和應用情境。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.