版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、課程名稱:String類的基本特點(diǎn)講師:李興華INFRASTRURUNTIME searchtoMPUTE IDENTIT* 比講師:李興華INFRASTRURUNTIME searchtoMPUTE IDENTIT* 比ICONTENTATIONJava8面向?qū)ο缶幊蘏tring類的基本特點(diǎn)2、知識點(diǎn)2.1、上次課程的主要知識點(diǎn)數(shù)組2.2、本次預(yù)計(jì)講解的知識點(diǎn)1、 String類的兩種實(shí)例化方式的區(qū)別;2、 String類對象的比較;3、 String類對象的使用分析。3、具體內(nèi)容(★★★★★)3.1、String類的兩種實(shí)例化方式String并不是一個基本數(shù)據(jù)類型,它本身屬于一個類,但是這個類在設(shè)計(jì)的過程之中加入了一些Java自己的特殊支持,第(1)頁共(9)頁所以對于這個類的對象實(shí)例化方式就有兩種形式:?直接賦值:String對象="內(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)在有兩個int型的變量,那么要進(jìn)行相等的判斷,則直接使用“==”即可。范例:兩個int比較publicclassStringDemo{publicstaticvoidmain(Stringargs[]){intx=10;//直接賦值inty=10;//直接賦值System.out.println(x==y);//true}}發(fā)現(xiàn)兩個利用直接賦值實(shí)現(xiàn)的程序,那么使用“==”的時候可以正常的進(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)在程序中如果使用“==”比較的只是兩個對象(任意的引用類型)堆內(nèi)存地址數(shù)值,屬于數(shù)值內(nèi)容的比較,并不是堆內(nèi)存中保存內(nèi)容的比較,那么要想進(jìn)行String對象內(nèi)容的比較則可以利用String類中提供的一個方法完成:?字符串比較(暫時將此方法進(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()方法完成,絕對不可能出現(xiàn)“==”。面試題:請解釋在String比較中“==”與“equals?!钡膮^(qū)別??“==”:是Java本身提供的關(guān)系運(yùn)算符,可以進(jìn)行數(shù)值比較,如果用在String上表示對象內(nèi)存地址數(shù)值比較;? “equals?!保菏荢tring類自己定義的方法,用于進(jìn)行字符串內(nèi)容的比較。3.3、String匿名對象任何的編程語言都不會提供有字符串這一數(shù)據(jù)類型。字符串的描述在很多語言之中都使用字符數(shù)組表示。而在Java的設(shè)計(jì)之處為了解決這樣的問題,專門提供了一個String類來進(jìn)行描述。但是隨著發(fā)展,為了能夠讓程序變得更加的易于開發(fā),所以在Java里面也提供雙引號聲明的數(shù)據(jù),而這些數(shù)據(jù),在Java中并不是普通的變量,而是屬于String類的匿名第(3)頁共(9)頁對象。范例:驗(yàn)證匿名對象publicclassStringDemo{publicstaticvoidmain(Stringargs[]){Stringstr="hello";System.out.println("hello".equals(str));}}現(xiàn)在發(fā)現(xiàn),此時已經(jīng)可以通過字符串調(diào)用equals()方法,那么就證明一點(diǎn),字符串的確是String類的匿名對象。那么之前的“String字符串對象="字符串";”,本質(zhì)就是為一個字符串的匿名對象起了一個名字。微有作用的經(jīng)驗(yàn)分享:如果現(xiàn)在假設(shè)你的開發(fā)有這樣一種需求:用戶輸入一些指令,而后根據(jù)輸入指令判斷要執(zhí)行操作。那么此時就存在有兩種做法:做法一:利用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)錯誤(NullPointerException)。做法二:反過來寫publicclassStringDemo{publicstaticvoidmain(Stringargs[]){Stringinput=null; //假設(shè)為輸入數(shù)據(jù)if("run".equals(input)){System.out.println("*******系統(tǒng)開始運(yùn)轉(zhuǎn)**********");}}}首先字符串的匿名對象永遠(yuǎn)不可能是null,并且在equals()方法里面支持有null的驗(yàn)證,所以如果發(fā)現(xiàn)要比較的內(nèi)容為null返回的就是false。字符串常量=String類的匿名對象。比較字符串內(nèi)容是否相同時,將常量寫在前面。3.4、String類兩種實(shí)例化對象的區(qū)別(核心)聲明:在開發(fā)之中如果發(fā)現(xiàn),有多種方式可以實(shí)現(xiàn)同一結(jié)果,那么就有可能出現(xiàn)面試題。此時對于String類的實(shí)例化方式出現(xiàn)有兩種,那么這兩種方式到底該使用那一種,以及每種方式的區(qū)別是什么呢?分析一:分析String類對象直接實(shí)例化的形式直接賦值是現(xiàn)在為止看見最多的:publicclassStringDemo{
publicstaticvoidmain(Stringargs[]){Stringstr="hello";System.out.println(str);}}開辟一塊堆內(nèi)存空間,并且一個棧內(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)于對象池的概念(ObjectPool)在Java設(shè)計(jì)的過程之中為了方便用戶的代碼編寫開發(fā),針對于幾個特殊的類使用了共享設(shè)計(jì)的思路,其中String就屬于這其中的一員。這種設(shè)計(jì)思路是Java自己的支持,而且只針對于直接賦值的情況。在使用直接賦值實(shí)例化String類對象的操作之中,字符串的內(nèi)容定義之后實(shí)際上會自動將其保存在一個對象池之中,而后如果現(xiàn)在有其他的字符串對象也采用了直接賦值的形式,并且內(nèi)容與之前的字符串內(nèi)容完全相同,那么不會開辟新的堆內(nèi)存空間,而是通過對象池找到已有的堆內(nèi)存空間地址,直接引用即可,所以就會造成若干個字符串直接賦值之后,當(dāng)內(nèi)容相同時,地址是完全相同的,所以“==”的結(jié)果也是相同的,這樣的設(shè)計(jì)就是共享設(shè)計(jì)模式。分析二:利用構(gòu)造方法實(shí)例化對象還是以下面的程序?yàn)榉治鲆罁?jù):publicclassStringDemo{publicstaticvoidmain(Stringargs[]){Stringstr=newString("hello");System.out.println(str);}J看內(nèi)存關(guān)系。通過此時的內(nèi)存分析可以發(fā)現(xiàn),如果采用了構(gòu)造方法進(jìn)行String類對象的實(shí)例化操作,那么最終將產(chǎn)生兩塊堆內(nèi)存,其中有一塊是垃圾空間。如果現(xiàn)在使用了構(gòu)造方法進(jìn)行String類對象實(shí)例化還會牽扯到一個入池的問題。范例:沒有入池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類對象實(shí)例化,那么所產(chǎn)生的對象將不會保存在對象池之中,也就是說此對象無法重用。如果現(xiàn)在用戶需要讓這個對象入池,則只能通過手工的方式完成:?手工入池:publicStringintern。。范例:手工入池publicclassStringDemo{publicstaticvoidmain(Stringargs[]){Stringstra=newString("helloH).intern();//構(gòu)造方法Stringstrb="hello";//直接賦值System.out.println(stra==strb);//true}}面試題:請解釋String類兩種對象的實(shí)例化區(qū)別??直接賦值(Stringstr="字符串";):只會開辟一塊堆內(nèi)存空間,并且對象可以自動入池以供其他對象重復(fù)使用;?構(gòu)造方法(Stringstr=newString("字符串");):會開辟兩塊堆內(nèi)存空間,并且有一塊堆內(nèi)存將成為垃圾,同時產(chǎn)生的實(shí)例化對象不會自動入池,需要利用intern()方法手工入池。3.5/r/
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 注聚工成果評優(yōu)考核試卷含答案
- 救護(hù)儀器維修工崗前安全生產(chǎn)基礎(chǔ)知識考核試卷含答案
- 廣州建筑集團(tuán)招聘面試題及答案
- 供應(yīng)鏈管理效率提升工具庫存管理與采購成本控制版
- 人機(jī)交互界面優(yōu)化承諾書6篇
- 汽車回收工風(fēng)險評估與管理評優(yōu)考核試卷含答案
- 有色液固分離工風(fēng)險評估強(qiáng)化考核試卷含答案
- 酒精發(fā)酵工變革管理模擬考核試卷含答案
- 壓電石英片燒銀焊線工安全生產(chǎn)規(guī)范水平考核試卷含答案
- 河北省保定市曲陽縣一中2026屆高二生物第一學(xué)期期末預(yù)測試題含解析
- T-CNHC 4-2025 昌寧縣低質(zhì)低效茶園改造技術(shù)規(guī)程
- 雨課堂學(xué)堂在線學(xué)堂云《芊禮-謙循-送給十八歲女大學(xué)生的成人之禮(中華女子學(xué)院 )》單元測試考核答案
- 2025年手術(shù)室護(hù)理實(shí)踐指南試題(含答案)
- 智慧農(nóng)貿(mào)市場建設(shè)項(xiàng)目報告與背景分析
- 護(hù)理部競選副主任
- 【10篇】新版部編六年級上冊語文課內(nèi)外閱讀理解專項(xiàng)練習(xí)題及答案
- 2026年中國經(jīng)濟(jì)展望:風(fēng)鵬正舉
- 老年健康服務(wù)中的多學(xué)科團(tuán)隊(duì)協(xié)作
- 上市公司部門組織架構(gòu)及崗位職責(zé)大全
- 公司紡粘針刺非織造布制作工合規(guī)化技術(shù)規(guī)程
- 雨課堂學(xué)堂云在線《人工智能原理》單元測試考核答案
評論
0/150
提交評論