【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的實現和應用情境。