Java學習筆記21:””與null的區別、常量池的理解
””與null的區別
“”是字串常量,同時也是一個String類的物件,作為物件可以呼叫String類裡的方法。
null 是空常量,不能呼叫任何的方法,否則會出現空指標異常,null常量可以給任意的引用數量型別賦值。
String str1 = null; str引用為空
String str2 = ""; str引用一個空串
也就是null沒有分配空間,""分配了空間,因此str1還不是一個例項化的物件,而str2已經例項化。
注意因為null不是物件,"“是物件。所以比較的時候必須是 if(str1==null){…}和if(str2.equals(”")){…}。
物件用equals比較,null用等號比較。因此,如果str1=null;
下面的寫法錯誤:
if(str1.equals(" ")||str1==null){
//如果str1沒有值,則.... //。。
}
正確的寫法是:
if(str1==null||str1.equals(" ")){
//先判斷是不是物件,如果是,再判斷是不是空字串 //...
}
打個比方:一個空玻璃杯,你不能說它裡面什麼都沒有,因為裡面有空氣,當然也可以把它弄成真空,null與" "的區別就象真空與空氣一樣。
常量池的定義
常量池在java用於儲存在編譯期已確定的,已編譯的class檔案中的一份資料。它包括了關於類,方法,介面等中的常量,也包括字串常量,如String s = “java”這種申明方式;當然也可擴充,執行器產生的常量也會放入常量池,故認為常量池是JVM的一塊特殊的記憶體空間。
Java中的常量池,實際上分為兩種形態:靜態常量池和執行時常量池。
所謂靜態常量池,即*.class檔案中的常量池,class檔案中的常量池不僅僅包含字串(數字)字面量,還包含類、方法的資訊,佔用class檔案絕大部分空間。
而執行時常量池,則是jvm虛擬機器在完成類裝載操作後,將class檔案中的常量池載入到記憶體中,並儲存在方法區中,我們常說的常量池,就是指方法區中的執行時常量池。
常量池的優缺點
常量池的優點
常量池是為了避免頻繁的建立和銷燬物件而影響系統性能,其實現了物件的共享。
例如字串常量池,在編譯階段就把所有的字串文字放到一個常量池中。
(1)節省記憶體空間:常量池中所有相同的字串常量被合併,只佔用一個空間。
(2)節省執行時間:比較字串時,比equals()快。對於兩個引用變數,只用
常量池的缺點
如果硬要說弊端的話,就是犧牲了CPU計算時間來換空間。CPU計算時間主要用於在字串常量池中查詢是否有內容相同物件的引用。不過其內部實現為HashTable,所以計算成本較低。
常量池的使用場景
Integer的實現中,當大於等於-128小於等於127的Integer例項,在常量池中儲存的。
//TODO 需要看下JDK中常見的使用常量池的地方都有哪些.
參考文章
http://www.cnblogs.com/iyangyuan/p/4631696.html
http://www.jianshu.com/p/c7f47de2ee80
http://baike.baidu.com/item/常量池