String類的基本特點(diǎn)_第1頁
String類的基本特點(diǎn)_第2頁
String類的基本特點(diǎn)_第3頁
String類的基本特點(diǎn)_第4頁
String類的基本特點(diǎn)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、課程名稱:String類的基本特點(diǎn)講師:李興華INFRASTRURUNTIME searchtoMPUTE IDENTIT* 比講師:李興華INFRASTRURUNTIME searchtoMPUTE IDENTIT* 比ICONTENTATIONJava8面向?qū)ο缶幊蘏tring類的基本特點(diǎn)2、知識(shí)點(diǎn)2.1、上次課程的主要知識(shí)點(diǎn)數(shù)組2.2、本次預(yù)計(jì)講解的知識(shí)點(diǎn)1、 String類的兩種實(shí)例化方式的區(qū)別;2、 String類對(duì)象的比較;3、 String類對(duì)象的使用分析。3、具體內(nèi)容(★★★★★)3.1、String類的兩種實(shí)例化方式String并不是一個(gè)基本數(shù)據(jù)類型,它本身屬于一個(gè)類,但是這個(gè)類在設(shè)計(jì)的過程之中加入了一些Java自己的特殊支持,第(1)頁共(9)頁所以對(duì)于這個(gè)類的對(duì)象實(shí)例化方式就有兩種形式:?直接賦值:String對(duì)象="內(nèi)容";?構(gòu)造方法:publicString(Strings)。范例:使用直接賦值publicclassStringDemo{publicstaticvoidmain(Stringargs[]){Stringstr="Hello";str=str+"World";System.out.println(str);}}范例:利用構(gòu)造方法publicclassStringDemo{publicstaticvoidmain(Stringargs[]){Stringstr=newString("Hello");str=str+"World";System.out.println(str);}}至少現(xiàn)在通過執(zhí)行結(jié)果來講,String類的兩種實(shí)例化方式都是可用的。3.2、String的相等比較如果說現(xiàn)在有兩個(gè)int型的變量,那么要進(jìn)行相等的判斷,則直接使用“==”即可。范例:兩個(gè)int比較publicclassStringDemo{publicstaticvoidmain(Stringargs[]){intx=10;//直接賦值inty=10;//直接賦值System.out.println(x==y);//true}}發(fā)現(xiàn)兩個(gè)利用直接賦值實(shí)現(xiàn)的程序,那么使用“==”的時(shí)候可以正常的進(jìn)行相等判斷。但是如果現(xiàn)在將同樣的操作形式用在String上呢?范例:觀察String的比較publicclassStringDemo{publicstaticvoidmain(Stringargs[]){Stringstra="hello";Stringstrb=newString("hello");Stringstrc=strb; //引用傳遞System.out.println(stra==strb);//falseSystem.out.println(strb==strc);//trueSystem.out.println(stra==strc);//false}}棧內(nèi)存 >堆內(nèi)存stra(oxOOOl)"hello"strb(oxOOlO)"hello"strc(oxOOlO)oxOOOloxOOlO棧內(nèi)存堆內(nèi)存stra >棧內(nèi)存堆內(nèi)存stra >"hello"strb >"hello"Stringstra="hello";Stringstrb=newString("hello");Stringstrc=strb;所以發(fā)現(xiàn)在程序中如果使用“==”比較的只是兩個(gè)對(duì)象(任意的引用類型)堆內(nèi)存地址數(shù)值,屬于數(shù)值內(nèi)容的比較,并不是堆內(nèi)存中保存內(nèi)容的比較,那么要想進(jìn)行String對(duì)象內(nèi)容的比較則可以利用String類中提供的一個(gè)方法完成:?字符串比較(暫時(shí)將此方法進(jìn)行修改):publicbooleanequals(Stringstr)。范例:利U用equals。實(shí)現(xiàn)字符串內(nèi)容的比較publicclassStringDemo{publicstaticvoidmain(Stringargs[]){Stringstra="hello";Stringstrb=newString("hello");Stringstrc=strb; //引用傳遞System.out.println(stra.equals(strb));〃trueSystem.out.println(strb.equals(strc));〃trueSystem.out.println(stra.equals(strc));〃true}}由于內(nèi)容是可控的因素,而地址是不可控的因素,所以在日后的開發(fā)之中,只要是字符串的比較都使用equals()方法完成,絕對(duì)不可能出現(xiàn)“==”。面試題:請(qǐng)解釋在String比較中“==”與“equals?!钡膮^(qū)別??“==”:是Java本身提供的關(guān)系運(yùn)算符,可以進(jìn)行數(shù)值比較,如果用在String上表示對(duì)象內(nèi)存地址數(shù)值比較;? “equals。”:是String類自己定義的方法,用于進(jìn)行字符串內(nèi)容的比較。3.3、String匿名對(duì)象任何的編程語言都不會(huì)提供有字符串這一數(shù)據(jù)類型。字符串的描述在很多語言之中都使用字符數(shù)組表示。而在Java的設(shè)計(jì)之處為了解決這樣的問題,專門提供了一個(gè)String類來進(jìn)行描述。但是隨著發(fā)展,為了能夠讓程序變得更加的易于開發(fā),所以在Java里面也提供雙引號(hào)聲明的數(shù)據(jù),而這些數(shù)據(jù),在Java中并不是普通的變量,而是屬于String類的匿名第(3)頁共(9)頁對(duì)象。范例:驗(yàn)證匿名對(duì)象publicclassStringDemo{publicstaticvoidmain(Stringargs[]){Stringstr="hello";System.out.println("hello".equals(str));}}現(xiàn)在發(fā)現(xiàn),此時(shí)已經(jīng)可以通過字符串調(diào)用equals()方法,那么就證明一點(diǎn),字符串的確是String類的匿名對(duì)象。那么之前的“String字符串對(duì)象="字符串";”,本質(zhì)就是為一個(gè)字符串的匿名對(duì)象起了一個(gè)名字。微有作用的經(jīng)驗(yàn)分享:如果現(xiàn)在假設(shè)你的開發(fā)有這樣一種需求:用戶輸入一些指令,而后根據(jù)輸入指令判斷要執(zhí)行操作。那么此時(shí)就存在有兩種做法:做法一:利用String變量調(diào)用equals()方法publicclassStringDemo{publicstaticvoidmain(Stringargs[]){Stringinput="run";//假設(shè)為輸入數(shù)據(jù)if(input.equals("run")){System.out.println("*******系統(tǒng)開始運(yùn)轉(zhuǎn)**********");}}}但是,既然input的內(nèi)容是由用戶輸入的,那么就有可能不輸入。如果不輸入內(nèi)容就有可能為null,則null調(diào)用equals()方法就有可能出現(xiàn)錯(cuò)誤(NullPointerException)。做法二:反過來寫publicclassStringDemo{publicstaticvoidmain(Stringargs[]){Stringinput=null; //假設(shè)為輸入數(shù)據(jù)if("run".equals(input)){System.out.println("*******系統(tǒng)開始運(yùn)轉(zhuǎn)**********");}}}首先字符串的匿名對(duì)象永遠(yuǎn)不可能是null,并且在equals()方法里面支持有null的驗(yàn)證,所以如果發(fā)現(xiàn)要比較的內(nèi)容為null返回的就是false。字符串常量=String類的匿名對(duì)象。比較字符串內(nèi)容是否相同時(shí),將常量寫在前面。3.4、String類兩種實(shí)例化對(duì)象的區(qū)別(核心)聲明:在開發(fā)之中如果發(fā)現(xiàn),有多種方式可以實(shí)現(xiàn)同一結(jié)果,那么就有可能出現(xiàn)面試題。此時(shí)對(duì)于String類的實(shí)例化方式出現(xiàn)有兩種,那么這兩種方式到底該使用那一種,以及每種方式的區(qū)別是什么呢?分析一:分析String類對(duì)象直接實(shí)例化的形式直接賦值是現(xiàn)在為止看見最多的:publicclassStringDemo{

publicstaticvoidmain(Stringargs[]){Stringstr="hello";System.out.println(str);}}開辟一塊堆內(nèi)存空間,并且一個(gè)棧內(nèi)存將直接指向該堆內(nèi)存空間。范例:繼續(xù)觀察直接賦值publicclassStringDemo{publicstaticvoidmain(Stringargs[]){Stringstra="hello";Stringstrb="hello";Stringstrc="nihao";System.out.println(stra==strb);//trueSystem.out.println(stra==strc);//falseSystem.out.println(strb==strc);//false}}本程序的內(nèi)存關(guān)系圖如下。

解釋:關(guān)于對(duì)象池的概念(ObjectPool)在Java設(shè)計(jì)的過程之中為了方便用戶的代碼編寫開發(fā),針對(duì)于幾個(gè)特殊的類使用了共享設(shè)計(jì)的思路,其中String就屬于這其中的一員。這種設(shè)計(jì)思路是Java自己的支持,而且只針對(duì)于直接賦值的情況。在使用直接賦值實(shí)例化String類對(duì)象的操作之中,字符串的內(nèi)容定義之后實(shí)際上會(huì)自動(dòng)將其保存在一個(gè)對(duì)象池之中,而后如果現(xiàn)在有其他的字符串對(duì)象也采用了直接賦值的形式,并且內(nèi)容與之前的字符串內(nèi)容完全相同,那么不會(huì)開辟新的堆內(nèi)存空間,而是通過對(duì)象池找到已有的堆內(nèi)存空間地址,直接引用即可,所以就會(huì)造成若干個(gè)字符串直接賦值之后,當(dāng)內(nèi)容相同時(shí),地址是完全相同的,所以“==”的結(jié)果也是相同的,這樣的設(shè)計(jì)就是共享設(shè)計(jì)模式。分析二:利用構(gòu)造方法實(shí)例化對(duì)象還是以下面的程序?yàn)榉治鲆罁?jù):publicclassStringDemo{publicstaticvoidmain(Stringargs[]){Stringstr=newString("hello");System.out.println(str);}J看內(nèi)存關(guān)系。通過此時(shí)的內(nèi)存分析可以發(fā)現(xiàn),如果采用了構(gòu)造方法進(jìn)行String類對(duì)象的實(shí)例化操作,那么最終將產(chǎn)生兩塊堆內(nèi)存,其中有一塊是垃圾空間。如果現(xiàn)在使用了構(gòu)造方法進(jìn)行String類對(duì)象實(shí)例化還會(huì)牽扯到一個(gè)入池的問題。范例:沒有入池publicclassStringDemo{publicstaticvoidmain(Stringargs[]){Stringstra=newString("hello");//構(gòu)造方法Stringstrb="hello";//直接賦值System.out.println(stra==strb);//false}}現(xiàn)在的代碼之中,發(fā)現(xiàn)如果使用了構(gòu)造方法進(jìn)行String類對(duì)象實(shí)例化,那么所產(chǎn)生的對(duì)象將不會(huì)保存在對(duì)象池之中,也就是說此對(duì)象無法重用。如果現(xiàn)在用戶需要讓這個(gè)對(duì)象入池,則只能通過手工的方式完成:?手工入池:publicStringintern。。范例:手工入池publicclassStringDemo{publicstaticvoidmain(Stringargs[]){Stringstra=newString("helloH).intern();//構(gòu)造方法Stringstrb="hello";//直接賦值System.out.println(stra==strb);//true}}面試題:請(qǐng)解釋String類兩種對(duì)象的實(shí)例化區(qū)別??直接賦值(Stringstr="字符串";):只會(huì)開辟一塊堆內(nèi)存空間,并且對(duì)象可以自動(dòng)入池以供其他對(duì)象重復(fù)使用;?構(gòu)造方法(Stringstr=newString("字符串");):會(huì)開辟兩塊堆內(nèi)存空間,并且有一塊堆內(nèi)存將成為垃圾,同時(shí)產(chǎn)生的實(shí)例化對(duì)象不會(huì)自動(dòng)入池,需要利用intern()方法手工入池。3.5/r/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論