java開發_""和null的區別


今天在工作中遇到一個問題:

在代碼中:

1 //name可以為"",即:name == ""
2 //但是name不可以為null,即:name != null

下面是java中的null和""區別:

  1 null和""的區別
  2 問題一:
  3 null和""的區別
  4 String s=null;
  5 string.trim()就會拋出為空的exception   
  6 String s="";   
  7 string.trim()就不會拋,為什么? 
  8 答:
  9 NULL代表聲明了一個空對象,根本就不是一個字符串。   
 10 ""代表聲明了一個對象實例,這個對象實例的值是一個長度為0的空字符串。
 11 
 12 NULL代表聲明了一個空對象,對空對象做任何操作都不行的,除了=和==   
 13 ""是一個字符串了,只是這個字符串里面沒有內容了
 14 
 15 String s=null;只是定義了一個句柄,也就是說你有了個引用,但是這個引用未指向任何內存空間   
 16 String s="";這個引用已經指向了一塊是空字符串的內存空間,是一個實際的東東了,所以你可以對它操作,而不用擔心什么了
 17 
 18 你說數字0和沒有是不是一種概念啊??道理一樣的
 19 
 20 而且,null可以賦值給任何對象.""就不行了.
 21 
 22 這里""和NULL絕對是兩個概念   
 23 ""代表一個字符串存在,它的值就是“”   
 24 NULL代表字符串根本沒有實際的值,你並不知道它是什么。。。
 25 
 26 哦,我明白了,意思就是String   string   =   null   跟String   string;是一回事兒
 27 
 28 null是空對象     ""是空字符串
 29 String s=null;//null是未分配堆內存空間   
 30 String   a;//分配了一個內存空間,沒存入任何對象   
 31 String   a="";//分配了一個內存空間,存了一個字符串對象
 32 
 33 
 34 
 35 問題二:
 36 String s;和String s=null;和String s="a";有什么區別?   
 37 針對這三種情況,使用out.println(s);的時候,第一個會出現異常,第二個會輸出null.第三個則會輸出a.   
 38 這是為什么呢?這三句聲明語句,各自作了什么呢?
 39 
 40 答:
 41 第一個只是定義了一個String類型變量s,並沒有給它賦初值,在Java中,默認在使用一個變量的時候必須賦予它初值(降低風險)。 
 42 第二個和第三個都定義了String類型變量s,並賦予它初值,只不過第二個賦予的值為null(空)罷了
 43 
 44 主要要理解的是String s; s為一個引用~~它不是對象   
 45 第一個是沒有初始化的引用;   
 46 第二個為空引用;
 47 第三個是在字符串池里寫入一個字符'a',然后用s指向它。
 48 另外,   
 49 String s="a"和String s=new String("a");是有本質上的區別的   
 50 前者是在字符串池里寫入一個字符'a',然后用s指向它;
 51 后者是在堆上創建一個內容為"a"的字符串對象。
 52 String   str="aaa";                    //於棧上分配內存
 53 String   str=new   String("aaa");      //於堆上分配內存
 54 
 55 String s; 系統會自動賦值null
 56 
 57 String s;只是給s分配一個內存空間   
 58 String s=null;是分配的空間中存儲的值為空值   
 59 String s="a";這句就不用我多說了分配的空間的值為字符a
 60 
 61 
 62 
 63 問題三:
 64 聲明了一個string a;變量    
 65 在以后的判斷中,a==""和a==null有何不同?   
 66 
 67 答:
 68 如果沒有給a賦過值,a==""會導致異常。     
 69 在實際處理時,往往認為""和null代表相同的含義,即都代表無值。   
 70 此時建議用如下語法:   
 71 if(a==null   ||   a=="")   
 72 {   
 73 }   
 74 如果a為null,就不會執行后面的判斷,直接返回true。   
 75 
 76 null是用來判斷引用類型是否分配了存儲空間   
 77 ""是針對字符串的;   
 78 string類型實際上是字符串指針,也即是一個引用類型   
 79 所以如果沒有給a賦過值,a==""會導致異常   
 80 所以if(a==null   ||   a==""){}這種寫法也是正確的
 81 
 82 
 83 問題四:
 84 String abc=null;String abc="";String abc;三種寫法有什么區別? 
 85 
 86 答:
 87 1:創建一個空字符串對象,   
 88 2:創建一個字符串為空的字符串對象。   
 89 3:聲明一個字符串對象,但並沒有分配內存,而1,2已經分配了內存   
 90 對於最后一種表示,你不能if(abc==null),或者int   length   =   abc.length();編譯的時候會提示可能沒有初始化.
 91 
 92 
 93 String   abc=null;   
 94 String   abc="";   
 95 一般推薦使用第二種   
 96 第一種abc指向null,很多時候要判斷字符串是否為空時,容易漏掉這種情況,在調用String的相關方法的時候就會出錯   
 97 第二種則相對簡單,String的方法都可以用,判斷的時候也不會出錯
 98 
 99 1) String   abc=null;   
100 2) String   abc;    
101 3)String   a="";   
102 4) String   b="";   
103 5) String   c=new String("");   
104 6) String   d=new String(""); 
105 //1)等於2),和C語言不同,JAVA為安全原因不允許一個懸掛引用,沒有賦值的引用地址一律自動賦值為NULL,以防止訪問到任意內存   
106 //3)和4)中,變量a和b將會指向同一內存地址(""的地址)   
107 //5)和6)中,變量c和d不會指向同一地址,而是兩個""內容的地址,並且和a,b不同,實際上,3)和4)相當於new String("").intern().   
108 //String類維護着一個字符串池,對於像3)和4)這樣的賦值方法,String會在這個池中查找字符串是否已經在池中,如果在,就直接指向該地址,
109 
110 如果不在,生成一個實例放入池中再指向那個地址,可見對於同樣內容的字符串多次引用時3)4)的方法要比5)6)的方法剩內存,之所以這樣做,是
111 
112 因為String是一個內容不可變的量,運用的是設計模式GOF.FlyWeight   
113 
114 
115 
116 
117 但有個關鍵的一點,沒有人說到,這就是:   
118 String s;在什么情況下可以等同於String s=null;而在什么情況下又不等同?!
119 考慮下面的代碼:   
120 //StringTest.java   
121 public   class   StringTest   {      
122     static   String   s;     //*   
123     public   static   void   main(String[]   args)   {   
124         //String   s;         //**   
125         System.out.println(s);   
126     }   
127 }     
128 編譯並運行上面的代碼,將打印null。
129 可見標有*號的行是自動初始化了的(s被自動初始化為null)。   
130 而如果把標有**號的行取消注釋,代碼將不能通過編譯,這是因為這行定義的是本地變量,而本地變量是不會自動初始化的。
131 由此得出結論:
132 在成員變量的定義中,String s;等同於String s=null;
133 而在本地變量(方法變量)的定義中,String s;不等同於String s=null;,這時要使用s必須顯式地賦值。
134 這些雖然是小知識點,但在實際應用中很重要,也很容易被一些人忽視,特此提出。
135 還有一點要說明的是:
136 只要是在方法在中定義變量都要顯示賦初值,main()方法也不例外,而在方法之外編譯器回自動賦初值。
137 
138  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM