一. String類的兩種實(shí)例化方式
1. String可以采用直接賦值的形式進(jìn)行操作眯搭,這一點(diǎn)像基本數(shù)據(jù)類型的賦值操作一樣。
范例:String str = "hello"各薇; ? ? // 這里的string僅僅增加了一個(gè)雙引號(hào)而已
2. String既然是一個(gè)類项贺,那么必然存在構(gòu)造方法。
構(gòu)造:Public String(String str); ? // 前一個(gè)String為類名稱峭判,后一個(gè)String為參數(shù)類型
范例:String str = new String("hello")开缎;
二. 字符串比較
1. 使用“==”比較字符串
? ? String str1 = "hello" ;
? ? String str2 = new String("hello")林螃;
? ? System.out.println(str1 == str2) ;
輸出:false
分析:因?yàn)閟tr1和str2保存在棧內(nèi)存中啥箭,分別存放了兩個(gè)對(duì)象所保存的內(nèi)存地址的數(shù)值,因此不相等治宣。這種比較屬于地址數(shù)值比較,并沒(méi)有比較對(duì)象的內(nèi)容砌滞。
2. 進(jìn)行字符串對(duì)象內(nèi)容比較
用String類提供的方法來(lái)實(shí)現(xiàn)內(nèi)容比較侮邀,方法:Public boolean equals(String str)
? ? String str1 = "hello" ;
? ? String str2 = new String("hello")贝润;
? ? System.out.println(str1.equals(str2)) ;
輸出:true
三. 字符串為匿名對(duì)象
在任何語(yǔ)音的底層上面都不會(huì)提供直接的字符串類型绊茧,所謂的字符串只是高級(jí)語(yǔ)言提供給用戶方便開(kāi)發(fā)的支持而已,它本身存的并不是字符串打掘。所有語(yǔ)言對(duì)于字符串的底層實(shí)現(xiàn)都是字符數(shù)組华畏,數(shù)組的最大缺陷就是長(zhǎng)度固定。
在Java里面本身并沒(méi)有提供字符串常量的概念尊蚁,所有使用“""”定義的內(nèi)容本質(zhì)上來(lái)講都是String的匿名對(duì)象亡笑。
范例:
? ? String str = "hello" ;
? ? System.out.println("hello".equals(str)) ; ? ? ?// 能夠調(diào)用equals方法横朋,說(shuō)明"hello"是一個(gè)對(duì)象
提醒:在日后的開(kāi)發(fā)過(guò)程中仑乌,如果要判斷用戶輸入的字符串是否等同于指定的字符串,那么一定要將指定的字符串寫在前面琴锭。(避免用戶沒(méi)有輸入的情況下晰甚,input為null,導(dǎo)致出現(xiàn)異常NullPointerException)
范例:
? ? String input = null 决帖;// 用戶沒(méi)有輸入的話
? ? System.out.println(str1.equals("hello")) ;? // 如果將"hello"寫在前面厕九,即使用戶不輸入,也只 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 是會(huì)出現(xiàn)一個(gè)false而已地回。這個(gè)跟if語(yǔ)句里的"==
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 一個(gè)道理扁远,數(shù)值寫前面俊鱼,避免少些一個(gè)"="
四. String兩種實(shí)例化的區(qū)別
1. “""”雙引號(hào)形式
? ? String str1 = "hello" ;
? ? String str2 = "hello" 穿香;
? ? System.out.println(str1 == str2) ;
? ? System.out.println("hello" == str2) ;
? ? System.out.println("hello" == "hello") ;
輸出:都為true ? (該結(jié)果一方面與共享設(shè)計(jì)有關(guān)亭引,另一方面由于JDK版本不同可能存在若干差異,低版本可能出現(xiàn)為false的情況)
String類的設(shè)計(jì)使用了一個(gè)共享設(shè)計(jì)模式皮获。
? ? ? ? 在JVM的底層實(shí)際上會(huì)自動(dòng)維護(hù)一個(gè)對(duì)象池(字符串對(duì)象池)焙蚓,如果現(xiàn)在采用了直接賦值的模式進(jìn)行String類對(duì)象的實(shí)例化操作,那么該實(shí)例化對(duì)象(字符串)將自動(dòng)的保存到這個(gè)對(duì)象池之中洒宝。如果下次繼續(xù)有人使用了直接賦值的模式聲明了String類的對(duì)象购公,那么如果此時(shí)對(duì)象池之中有指定的內(nèi)容,將進(jìn)行直接引用雁歌,如果沒(méi)有宏浩,則開(kāi)辟新的字符串對(duì)象,而后將其保存在對(duì)象池之中以供下次使用(所謂的對(duì)象池就是一個(gè)對(duì)象數(shù)組)靠瞎。
2. 采用構(gòu)造方法
? ? String str = new String("hello")比庄;
采用構(gòu)造方法的形式會(huì)開(kāi)辟兩塊堆內(nèi)存空間,其中一塊堆內(nèi)存空間將成為垃圾乏盐,除了這一缺點(diǎn)之外佳窑,實(shí)際上也會(huì)對(duì)字符串共享產(chǎn)生影響。
范例:
? ? String str1 = new String("hello")父能;
? ? String str2 = "hello"神凑;
? ? System.out.println(str1 == str2) ;
輸出:false
此時(shí),String str1 = new String("hello")中的str1指向的堆內(nèi)存并未保存到對(duì)象池之中何吝,可以使用String類中的方法:public String intern()溉委,手工進(jìn)行入池操作。這個(gè)方法剛好返回的也是一個(gè)String類型爱榕,所以能夠?qū)崿F(xiàn)入池的操作瓣喊。
范例:
? ? String str1 = new String("hello").intern();
? ? String str2 = "hello"呆细;
? ? System.out.println(str1 == str2) ;
輸出:true
五. 字符串一旦定義不可改變
? ?String str = "hello"型宝;
? ?str = str + "world" ;
? ?str += "!!!" ;
分析:字符串修改產(chǎn)生了大量的垃圾,所以開(kāi)發(fā)時(shí)應(yīng)避免大量使用絮爷。如下例所示:
String str = ""趴酣;
for(int i = 0 ;i < 100 ;i ++) {
str += i ;
}
總結(jié):
1. 字符串的使用采用直接賦值的方式完成;
2. 字符串的比較就使用equals()方法實(shí)現(xiàn)坑夯;
3. 字符串沒(méi)事別改變太多岖寞。
感悟:為什么String首字母大寫,因?yàn)樗且粋€(gè)類啊柜蜈,哈哈~~~ ? ?C#里邊是小寫的string仗谆,剛開(kāi)始寫Java的時(shí)候我就按照習(xí)慣寫的小寫的指巡。。隶垮。藻雪。。狸吞。