String數據類型是引用類型,但是也是比較特殊的引用類型,他有兩個特別之處。
一個是當給String類型數據賦值后,它開辟的內存里面的數值就不能再發生改變了(如果想再次改變該String類型變量值,就需要再新開辟一段內存,并用該句柄指向新內存地址)。
第二個是String類型數據是共享式數據,因此當用直接值賦值法給兩個String類型數據賦值時,如果當賦的“值”相等,則默認為兩個String類型數據的句柄指向了同一塊堆內存,地址是相同的(其他引用類型數據沒有這個特性,值相同卻地址不同),因此這兩個數據數值相同,地址也相同。
如果兩個String類型數據一個是直接值賦值的,則句柄指向新開辟出來的內存地址;另一個是new出來的,則第二個數據的內存分配情況是先匿名對象開辟出來一塊堆內存,然后在new出來一塊堆內存,而句柄指向了后一塊內存地址。因此這兩個數據地址是不相同的,只是數值相等。
下面看個小例子:
String s1 ="abc";
String s2 ="abc";
String s3 =new String("abc");
if(s1==s2){
System.out.println("這兩個數據地址相同");
}
else{
System.out.println("這兩個數據地址不相同");
}
if(s1==s3){
System.out.println("這兩個數據地址相同");
}
else{
System.out.println("這兩個數據地址不相同");
}
輸出結果是:
這是為什么呢?我們看看內存空間的指向。
當s1和s2相比時:
當s1和s3相比時:
所以s1和s2的地址是相同的,s1和s3的地址是不同的。