(1)問題一:
null和""的區別
String s=null;
string.trim()就會拋出為空的exception
String s="";
string.trim()就不會拋,
為什么?
答:
NULL:代表聲明了一個空對象,不是一個字符串,可以賦給任何對象。
"" :代表聲明了一個對象實例,這個對象實例的值是一個長度為0的空字符串。
String s=null; 只是定義了一個句柄,即你有了個引用,但是這個引用未指向任何內存空間
String s=""; 這個引用已經指向了一塊是空字符串的內存空間,是一個實際的東東了,所以你可以對它操作。
(2)問題二:
String s1; //分配了一個內存空間,沒存入任何對象
String s2=null; //null是未分配堆內存空間
String s3="a"; //分配了一個內存空間,存了一個字符串對象
out.println(s1); // 出現異常
out.println(s2); // 輸出null
out.println(s3); // 輸出“a”
答:
主要要理解的是String s; s為一個引用~~它不是對象
第一個是沒有初始化的引用;
第二個為空引用;
第三個是在字符串池里寫入一個字符'a',然后用s指向它。
另外,
String s="a"和String s=new String("a");是有本質上的區別的 :
(1)
前者是在字符串池里寫入一個字符'a',然后用s指向它;
后者是在堆上創建一個內容為"a"的字符串對象。
(2)
String str="aaa"; //於棧上分配內存
String str=new String("aaa"); //於堆上分配內存
(3)問題三:
String a;
if(a=="") //編譯階段即異常
String a = null;
if(a==null) //返回true
答:
在實際處理時,往往認為""和null代表相同的含義,即都代表無值。
此時建議用如下語法:
if(a==null || a=="")
{
}
如果a為null,就不會執行后面的判斷,直接返回true。
null:是用來判斷引用類型是否分配了存儲空間
"" :是針對字符串的;
(4)問題四:
String s;在什么情況下可以等同於String s=null;而在什么情況下又不等同?
考慮下面的代碼:
1 //StringTest.java 2 public class StringTest { 3 4 static String s; 5 6 public static void main(String[] args) { 7 System.out.println(s); //輸出null 8 } 9 }
編譯並運行上面的代碼,將打印null。
s是自動初始化了的(s被自動初始化為null)。
由此得出結論:
在成員變量的定義中,String s;等同於String s=null;
而在本地變量(方法變量)的定義中,String s;不等同於String s=null;,這時要使用s必須顯式地賦值。
還有一點要說明的是:
只要是在方法在中定義變量都要顯示賦初值,main()方法也不例外,而在方法之外編譯器會自動賦初值。