本文由網(wǎng)友大力支持:http://www.reibang.com/p/c7f47de2ee80
?8種基本類型的包裝類和常量池
Byte,Short,Integer, Long,Boolean,Character妥曲。
Integer:
Integer i1 = 40; Integer i2 = 40;? ?i1 == i2;
//輸出true;
默認創(chuàng)建了數(shù)值[-128岔帽,127]的相應類型的緩存數(shù)據(jù)满着,但是超出此范圍仍然會去創(chuàng)建新的對象畦攘。但是官边,以下情況會輸出false.
? Integer I1 = 50;?
Integer I2 =? new Integer(50) ;
//輸出false( I1 ==? I2);
Boolean這個就true和false,這個很容易理解
Double:
兩種浮點數(shù)類型的包裝類Float,Double并沒有實現(xiàn)常量池技術癞季。
Float 也同樣沒有實現(xiàn)锡移。
Double i1=2.2; Double i2=2.2 ;??i1==i2 ;? //輸出false
String:
Stringstr1 ="abcd";? ? ? ? Stringstr2 =newString("abcd");? (str1==str2); //false
第一種方式是在常量池拿對象,第二種是直接在堆中創(chuàng)建一個新對象崔赌。 所以輸出false意蛀。
但是有一個方法:
java.lang.String.intern();
String的intern()方法會查找在常量池中是否存在一份equal相等的字符串,如果有則返回該字符串的引用,如果沒有則添加自己的字符串進入常量池。
Stringstr1 ="abcd";? ? ? ?Stringstr2 =newString("abcd");??
?str1.intern()? == str2? ; //true
這樣會輸出 true健芭。
運行時常量池 具備動態(tài)性 县钥。在運行期間也可能將新的常量放入池中 。 用 intern 方法最多慈迈。
另外一些情況如下:
String s1 = "s";? ?String s2 = "f";
String s3 = "sf";
s3 == s1+ s2); //false
s3 == "s"+ "f"); //true
只有使用引號包含文本的方式創(chuàng)建的String對象之間使用“+”連接產生的新對象才會被加入字符串池中若贮。?所以第一種輸出 false。
String s1 = new String("xyz");?**創(chuàng)建了幾個對象? **
1)類加載對一個類只會進行一次兜看。"xyz"在類加載時就已經創(chuàng)建并駐留了(如果該類被加載之前已經有"xyz"字符串被駐留過則不需要重復創(chuàng)建用于駐留的"xyz"實例)锥咸。駐留的字符串是放在全局共享的字符串常量池中的。(2)在這段代碼后續(xù)被運行的時候细移,"xyz"字面量對應的String實例已經固定了搏予,不會再被重復創(chuàng)建。所以這段代碼將常量池中的對象復制一份放到heap中弧轧,并且把heap中的這個對象的引用交給s1 持有雪侥。這條語句創(chuàng)建了2個對象。?
常量池;
常量池分為兩種:靜態(tài)常量池和運行時常量池精绎。
靜態(tài)常量池也就是Class文件中的常量池速缨,我們這里舉一個簡單的例子,下面是一個HelloWorld的與源文件和Class文件代乃。
運行時常量池:運行時常量池是方法區(qū)的一部分旬牲。Class文件中除了有類的版本、字段搁吓、方法原茅、接口等描述信息外還有一項信息是常量池。
常量池是為了避免頻繁的創(chuàng)建和銷毀對象而影響系統(tǒng)性能堕仔,其實現(xiàn)了對象的共享擂橘。