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;
}