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