(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;而在什麼情況下又不等同?
考慮下面的代碼:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SZk92Y5B3bj9CXzV2Zh1WavwVbvNmLzd2bsJmbj5ibv1WbvN2Lc9CX6MHc0RHaiojIsJye.gif)
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 }
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SZk92Y5B3bj9CXzV2Zh1WavwVbvNmLzd2bsJmbj5ibv1WbvN2Lc9CX6MHc0RHaiojIsJye.gif)
編譯并運作上面的代碼,将列印null。
s是自動初始化了的(s被自動初始化為null)。
由此得出結論:
在成員變量的定義中,String s;等同于String s=null;
而在本地變量(方法變量)的定義中,String s;不等同于String s=null;,這時要使用s必須顯式地指派。
還有一點要說明的是:
隻要是在方法在中定義變量都要顯示賦初值,main()方法也不例外,而在方法之外編譯器會自動賦初值。