完全用例子告訴你!不過首先你要清楚問題問的是什么?
首先,因該明白String是引用類型,是一個類,是一個不可變的類,并且有著特殊的作用。
String 只能復制一次!復制后不可改變!
String s = new String(“abc”);
s = new String(“cba”);
以上的代碼并不是對s進行賦值,而是將“abc”的引用地址,從新賦給了s;
這個過程的內存是怎么分配的呢?
有幾個問題要給大家說明一下:
1.String s = new String("abc");
//在運行時涉及幾個String實例?
答案:兩個,一個是字符串字面量"xyz"所對應的、駐留(intern)在一個全局共享的字符串常量池中的實例,另一個是通過new
String(String)創(chuàng)建并初始化的、內容與"xyz"相同的實例。
2.String s = new String("abc");//
涉及用戶聲明的幾個String類型的變量?
答案:一個,就一個String s 。
3.String s = null;
Java里變量就是變量,引用類型的變量只是對某個對象實例或者null的引用,不是實例本身。聲明變量的個數跟創(chuàng)建實例的個數沒有必然關系。
4.String s = new String("abc");
//創(chuàng)建了幾個String Object?
答案:兩個,一個是“abc”——這是一個匿名對象;一個是指向“abc”的引用對象s——這個是將匿名對象的地址賦給了s。
下面我們來看一段代碼:
public class text{
public static void main(String[] args){
//定義一個str
String str = new String("abc");
//定義一個str1
String str1 = "abc";
//定義一個str2
String str2 = "abc";
System.out.println(str1 == str);
System.out.println(str2 == str1);
}
}
運行結果是什么呢?
為什么第一個運行結果是false呢? 在這里"==" 其實比較的是他們在堆內存中的地址,因為str 和 str1 在堆內存中的地址不同的所以運行結果是false;
為什么第二個運行結果是true呢? 在這要說明一下,Sting是一個共享式輸出類型,在內存中有一個String pool 用于存放String類型中相同的值。所以在給str2賦值的時候,JVM會在String pool中查找是否有與其所賦的值相等,如果相等就將相等的值的地址賦給str2,如果沒有則在String pool中新開辟一塊控件存放str2的內容。
這是我現(xiàn)在對String的一些理解,如果有錯誤,希望大家指出來,在這里謝謝大家了!
posted on 2010-10-16 23:51
tovep 閱讀(375)
評論(4) 編輯 收藏