深入理解String

String類型字符串是一個不可變量,一旦賦值後便不可改變值內容,但可改變引用地址。

String兩種賦值方式的區別

①String a=“a”;這種方式會先在字符串常量池尋找是否有字符串a,有的話就引用其地址,否則新建(new String())並返回新的引用地址。如下的地址是相等的。

String a="a";
String b="a";
//String b="c"等價於String b=new String(c);
if(a==b)System.out.println(true);
else System.out.println(false);

②String a=new String(“a”)這種方式直接新開闢一個內存空間存放字符串,每次都會返回新地址,如下返回false;

String a=new String("a");
String b=new String("a");
if(a==b)System.out.println(true);
else System.out.println(false);

String類型字符串是一個不可變量,一旦賦值後便不可改變值內容。

public class Main {
    public static void main(String[] args) throws InterruptedException {
	String b = "a";
	String d = b;
	String e = b;
	if (d == e)
	    System.out.println(true);
	else
	    System.out.println(false);
    }
}

輸出結果:true
再來看以下

public class Main {
    public static void main(String[] args) throws InterruptedException {
	String b = "a";
	String d = b;
	b="b";//改變b的值,在常量池找不到"b",則新建b=new String("b"),新建了一個String類型,b的引用地址改變
	String e = b;
	if (d == e)
	    System.out.println(true);
	else
	    System.out.println(false);
    }
}

此時輸出結果:false
由此得出結論:String類型是不可變量,但重新賦值後其實是重新new了一個String,然後返回新的引用地址。這也可以解釋爲什麼當一個String作爲參數傳入方法中改變值後,原先的值不改變。

public static void main(String[] args) throws InterruptedException {
	String a = "1";
	if (a == changString(a))
	    System.out.println(true);
	else
	    System.out.print(false);
    }

    private static String changString(String str) {
	// str = "2";// 該種賦值方式,常量池無"2",新建字符串,返回新地址,結果false
	// str = "1";// 常量池存在字符串"1",結果true
	// str = new String("1");// 該種賦值方式直接新建字符串,返回新地址,結果false
	// str = new String("2");// 該種賦值方式直接新建字符串,返回新地址,結果false
	return str;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章