null是沒有地址
""是有地址可是裏面的內容是空的
null和""的區別 問題一: null和""的區別 String s=null; string.trim()就會拋出爲空的exception String s=""; string.trim()就不會拋,爲何? 答: NULL表明聲明瞭一個空對象,根本就不是一個字符串。 ""表明聲明瞭一個對象實例,這個對象實例的值是一個長度爲0的空字符串。 NULL表明聲明瞭一個空對象,對空對象作任何操做都不行的,除了=和== ""是一個字符串了,只是這個字符串裏面沒有內容了 String s=null;只是定義了一個句柄,也就是說你有了個引用,可是這個引用未指向任何內存空間 String s="";這個引用已經指向了一塊是空字符串的內存空間,是一個實際的東東了,因此你能夠對它操做,而不用擔憂什麼了 你說數字0和沒有是否是一種概念啊??道理同樣的 並且,null能夠賦值給任何對象.""就不行了. 這裏""和NULL絕對是兩個概念 ""表明一個字符串存在,它的值就是「」 NULL表明字符串根本沒有實際的值,你並不知道它是什麼。。。 哦,我明白了,意思就是String string = null 跟String string;是一回事兒 null是空對象 ""是空字符串 String s=null;//null是未分配堆內存空間 String a;//分配了一個內存空間,沒存入任何對象 String a="";//分配了一個內存空間,存了一個字符串對象 問題二: String s;和String s=null;和String s="a";有什麼區別? 針對這三種狀況,使用out.println(s);的時候,第一個會出現異常,第二個會輸出null.第三個則會輸出a. 這是爲何呢?這三句聲明語句,各自做了什麼呢? 答: 第一個只是定義了一個String類型變量s,並無給它賦初值,在Java中,默認在使用一個變量的時候必須賦予它初值(下降風險)。 第二個和第三個都定義了String類型變量s,並賦予它初值,只不過第二個賦予的值爲null(空)罷了 主要要理解的是String s; s爲一個引用~~它不是對象 第一個是沒有初始化的引用; 第二個爲空引用; 第三個是在字符串池裏寫入一個字符'a',而後用s指向它。 另外, String s="a"和String s=new String("a");是有本質上的區別的 前者是在字符串池裏寫入一個字符'a',而後用s指向它; 後者是在堆上建立一個內容爲"a"的字符串對象。 String str="aaa"; //於棧上分配內存 String str=new String("aaa"); //於堆上分配內存 String s; 系統會自動賦值null String s;只是給s分配一個內存空間 String s=null;是分配的空間中存儲的值爲空值 String s="a";這句就不用我多說了分配的空間的值爲字符a 問題三: 聲明瞭一個string a;變量 在之後的判斷中,a==""和a==null有何不一樣? 答: 若是沒有給a賦過值,a==""會致使異常。 在實際處理時,每每認爲""和null表明相同的含義,即都表明無值。 此時建議用以下語法: if(a==null || a=="") { } 若是a爲null,就不會執行後面的判斷,直接返回true。 null是用來判斷引用類型是否分配了存儲空間 ""是針對字符串的; string類型其實是字符串指針,也便是一個引用類型 因此若是沒有給a賦過值,a==""會致使異常 因此if(a==null || a==""){}這種寫法也是正確的 問題四: String abc=null;String abc="";String abc;三種寫法有什麼區別? 答: 1:建立一個空字符串對象, 2:建立一個字符串爲空的字符串對象。 3:聲明一個字符串對象,但並無分配內存,而1,2已經分配了內存 對於最後一種表示,你不能if(abc==null),或者int length = abc.length();編譯的時候會提示可能沒有初始化. String abc=null; String abc=""; 通常推薦使用第二種 第一種abc指向null,不少時候要判斷字符串是否爲空時,容易漏掉這種狀況,在調用String的相關方法的時候就會出錯 第二種則相對簡單,String的方法均可以用,判斷的時候也不會出錯 1) String abc=null; 2) String abc; 3)String a=""; 4) String b=""; 5) String c=new String(""); 6) String d=new String(""); //1)等於2),和C語言不一樣,JAVA爲安全緣由不容許一個懸掛引用,沒有賦值的引用地址一概自動賦值爲NULL,以防止訪問到任意內存 //3)和4)中,變量a和b將會指向同一內存地址(""的地址) //5)和6)中,變量c和d不會指向同一地址,而是兩個""內容的地址,而且和a,b不一樣,實際上,3)和4)至關於new String("").intern(). //String類維護着一個字符串池,對於像3)和4)這樣的賦值方法,String會在這個池中查找字符串是否已經在池中,若是在,就直接指向該地址, 若是不在,生成一個實例放入池中再指向那個地址,可見對於一樣內容的字符串屢次引用時3)4)的方法要比5)6)的方法剩內存,之因此這樣作,是 由於String是一個內容不可變的量,運用的是設計模式GOF.FlyWeight 但有個關鍵的一點,沒有人說到,這就是: String s;在什麼狀況下能夠等同於String s=null;而在什麼狀況下又不等同?! 考慮下面的代碼: //StringTest.java public class StringTest { static String s; //* public static void main(String[] args) { //String s; //** System.out.println(s); } } 編譯並運行上面的代碼,將打印null。 可見標有*號的行是自動初始化了的(s被自動初始化爲null)。 而若是把標有**號的行取消註釋,代碼將不能經過編譯,這是由於這行定義的是本地變量,而本地變量是不會自動初始化的。 由此得出結論: 在成員變量的定義中,String s;等同於String s=null; 而在本地變量(方法變量)的定義中,String s;不等同於String s=null;,這時要使用s必須顯式地賦值。 這些雖然是小知識點,但在實際應用中很重要,也很容易被一些人忽視,特此提出。 還有一點要說明的是: 只要是在方法在中定義變量都要顯示賦初值,main()方法也不例外,而在方法以外編譯器回自動賦初值。