第一次月考總結(jié)與反思
擴展閱讀:java中 null和“”的區(qū)別詳解
null和""的區(qū)別問題一:
null和""的區(qū)別Strings=null;
string.trim()就會拋出為空的exceptionStrings="";
string.trim()就不會拋,為什么?答:
NULL代表聲明了一個空對象,根本就不是一個字符串。
""代表聲明了一個對象實例,這個對象實例的值是一個長度為0的空字符串。
NULL代表聲明了一個空對象,對空對象做任何操作都不行的,除了=和==""是一個字符串了,只是這個字符串里面沒有內(nèi)容了
Strings=null;只是定義了一個句柄,也就是說你有了個引用,但是這個引用未指鄉(xiāng)任何內(nèi)存空間
Strings="";這個引用已經(jīng)指向了一塊是空字符串的內(nèi)存空間,是一個實際的東東了,所以你可以對它操作,而不用擔心什么了
你說數(shù)字0和沒有是不是一種概念啊??道理一樣的
而且,null可以賦值給任何對象.""就不行了.
這里""和NULL絕對是兩個概念
""代表一個字符串存在,它的值就是“”
NULL代表字符串根本沒有實際的值,你并不知道它是什么。。。
哦,我明白了,意思就是Stringstring=null跟Stringstring;是一回事兒
null是空對象""是空字符串
Strings=null;//null是未分配堆內(nèi)存空間
Stringa;//分配了一個內(nèi)存空間,沒存入任何對象Stringa="";//分配了一個內(nèi)存空間,存了一個字符串對象
問題二:
Strings;和Strings=null;和Strings="a";有什么區(qū)別?
針對這三種情況,使用out.println(s);的時候,第一個會出現(xiàn)異常,第二個會輸出null.第三個則會輸出a.
這是為什么呢?這三句聲明語句,各自作了什么呢?答:
第一個只是定義了一個String類型變量s,并沒有給它賦初值,在Java中,默認在使用一個變量的時候必須賦予它初值(降低風險)。第二個和第三個都定義了String類型變量s,并賦予它初值,只不過第二個賦予的值為null(空)罷了
主要要理解的是Strings;s為一個引用~~它不是對象第一個是沒有初始化的引用;第二個為空引用;
第三個是在字符串池里寫入一個字符"a",然后用s指向它。另外,
Strings="a"和Strings=newString("a");是有本質(zhì)上的區(qū)別的前者是在字符串池里寫入一個字符"a",然后用s指向它;后者是在堆上創(chuàng)建一個內(nèi)容為"a"的字符串對象。
Stringstr="aaa";//于棧上分配內(nèi)存Stringstr=newString("aaa");//于堆上分配內(nèi)存
Strings;系統(tǒng)會自動賦值null
Strings;只是給s分配一個內(nèi)存空間
Strings=null;是分配的空間中存儲的值為空值
Strings="a";這句就不用我多說了分配的空間的值為字符a
問題三:
聲明了一個stringa;變量
在以后的判斷中,a==""和a==null有何不同?答:
如果沒有給a賦過值,a==""會導致異常。
在實際處理時,往往認為""和null代表相同的含義,即都代表無值。此時建議用如下語法:if(a==null||a==""){}
如果a為null,就不會執(zhí)行后面的判斷,直接返回true。
null是用來判斷引用類型是否分配了存儲空間""是針對字符串的;
string類型實際上是字符串指針,也即是一個引用類型所以如果沒有給a賦過值,a==""會導致異常
所以if(a==null||a==""){}這種寫法也是正確的
問題四:Stringabc=null;Stringabc="";Stringabc;三種寫法有什么區(qū)別?答:
1:創(chuàng)建一個空字符串對象,
2:創(chuàng)建一個字符串為空的字符串對象。
3:聲明一個字符串對象,但并沒有分配內(nèi)存,而1,2已經(jīng)分配了內(nèi)存
對于最后一種表示,你不能if(abc==null),或者intlength=abc.length();編譯的時候會提示可能沒有初始化.
Stringabc=null;Stringabc="";一般推薦使用第二種第一種abc指向null,很多時候要判斷字符串是否為空時,容易漏掉這種情況,在調(diào)用String的相關(guān)方法的時候就會出錯
第二種則相對簡單,String的方法都可以用,判斷的時候也不會出錯
1)Stringabc=null;2)Stringabc;3)Stringa="";4)Stringb="";
5)Stringc=newString("");6)Stringd=newString("");//1)等于2),和C語言不同,JAVA為安全原因不允許一個懸掛引用,沒有賦值的引用地址一律自動賦值為NULL,以防止訪問到任意內(nèi)存
//3)和4)中,變量a和b將會指向同一內(nèi)存地址(""的地址)
//5)和6)中,變量c和d不會指向同一地址,而是兩個""內(nèi)容的地址,并且和a,b不同,實際上,3)和4)相當于newString("").intern().
//String類維護著一個字符串池,對于像3)和4)這樣的賦值方法,String會在這個池中查找字符串是否已經(jīng)在池中,如果在,就直接指向該地址,
如果不在,生成一個實例放入池中再指向那個地址,可見對于同樣內(nèi)容的字符串多次引用時3)4)的方法要比5)6)的方法剩內(nèi)存,之所以這樣做,是
因為String是一個內(nèi)容不可變的量,運用的是設計模式GOF.FlyWeight
但有個關(guān)鍵的一點,沒有人說到,這就是:
Strings;在什么情況下可以等同于Strings=null;而在什么情況下又不等同?!考慮下面的代碼://StringTest.java
publicclassStringTest{staticStrings;//*
publicstaticvoidmain(String[]args){//Strings;//**System.out.println(s);}}
編譯并運行上面的代碼,將打印null。
可見標有*號的行是自動初始化了的(s被自動初始化為null)。
而如果把標有**號的行取消注釋,代碼將不能通過編譯,這是因為這行定義的是本地變量,而本地變量是不會自動初始化的。由此得出結(jié)論:
在成員變量的定義中,Strings;等同于Strings=null;
而在本地變量(方法變量)的定義中,Strings;不等同于Strings=null;,這時要使用s必須顯式地賦值。
這些雖然是小知識點,但在實際應用中很重要,也很容易被一些人忽視,特此提出。還有一點要說明的是:
只要是在方法在中定義變量都要顯示賦初值,main()方法也不例外,而在方法之外編譯器回自動賦初值。
友情提示:本文中關(guān)于《第一次月考總結(jié)與反思》給出的范例僅供您參考拓展思維使用,第一次月考總結(jié)與反思:該篇文章建議您自主創(chuàng)作。
來源:網(wǎng)絡整理 免責聲明:本文僅限學習分享,如產(chǎn)生版權(quán)問題,請聯(lián)系我們及時刪除。