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