public class ArrToStr {
static String str ;
static String str1 = "";
static String str2 = "";
public static void main(String[] args){
System.out.println(str==str1);
System.out.println(str instanceof Object);
System.out.println(str1 instanceof Object);
System.out.println(str);
System.out.println("null".equals(str));
System.out.println(str==null);
System.out.println(str1.length());
System.out.println(str1==str2);
String str3 = "abc";
String str4 = str3;
String str5 = new String("abc");
String str6 = new String("abc");
System.out.println(str3==str4);
System.out.println(str5==str6);
System.out.println(str + str3);
}
}
通過上述測試代碼分析:
- String str = null是指str這個變量指向空對象;而“”是一個包含空字符的字符串對象。
- str == str1返回false,因爲“”和null不在同一內存地址空間,也就是說,着兩個變量沒有指向同一對象。
- "null".equals(str)返回false。因爲空串的值不是“null”。
- 空串str1是可以調用String對象的方法的,比如str1.length()的值爲0;而str.length()將會拋出異常NullPointerException。
- str3==str4返回true,因爲着兩個變量指向同一個對象"abc"(即內存中同一地址空間);而str==str6返回false,因爲用new在開闢了兩個不同的空間來存儲兩個“abc”對象,這樣着兩個變量所指向的地址就不同。
- equals指的是當字符串不爲空,並且字符串的值一樣時就返回true。
我們查看PrintStream的源碼,其實Java在println的時候進行了處理:
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
- 爲什麼str+str3打印出來是“nullabc”?
String的相加實際是被處理成StringBuilder的append方法。好,再看StringBuilder的源碼,發現調用的是父類的方法:
public StringBuilder append(String str) {
super.append(str);
return this;
}
public AbstractStringBuilder append(String str) {
if (str == null) str = "null";
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
java運行過程中特殊的疑問一定不要輕易放過,查看源碼會找到答案。