Java中的字符串類String是程序中使用十分頻繁而且在各大公司招聘筆試中必考的知識(shí)點(diǎn)之一。本文主要String的用法進(jìn)行分析。
用String來定義一個(gè)字符串一般有兩種方法:
1.String str=”hello world”;,2.String str=new String(“hello world”);
第一種方式:String str=”hello world”,生成的str是一個(gè)字符串常量。放在常量池中,所謂的常量池,是指給每個(gè)class類編譯時(shí)分配的用來保存class中的常量值,或者常量字符串的一個(gè)區(qū)域。對(duì)于每一個(gè)字符串在常量池中只保留一個(gè)值,每次用第一種方式定義一個(gè)字符串時(shí),jvm就會(huì)在常量池中找有沒有相同的字符串,有就返回一個(gè)該字符串的地址,如果沒有在常量池中生成該字符串。舉個(gè)例子:
定義String str=”helloworld”時(shí)jvm會(huì)先在常量池中找有沒有常量“helloworld”,因?yàn)槲覀兪堑谝淮味x因此并沒有“helloworld”,此時(shí)jvm會(huì)在常量池中給“helloworld”分配一個(gè)地址,并且在棧中給str分配地址;如下圖
先在在定義一個(gè)String str1=“helloworld”,此時(shí)jvm會(huì)先在常量池中找看有沒有常量值等于“helloworld”的找到了之后直接在棧中為str1分配一個(gè)地址,然后讓str1引用常量池中的“helloworld”,此時(shí)不再生成“helloworld”如下圖:
也就是說用第一種方法定義n個(gè)相同的字符串,它們都是指向常量池中的同一個(gè)常量。
用第二種方式:String str=new(“hello world”);是生成一個(gè)字符串對(duì)象,該對(duì)象存放在堆內(nèi)存中,當(dāng)用第二種方法生成多個(gè)相同字符串的對(duì)象時(shí),便會(huì)在堆中生成多個(gè)字符串對(duì)象。如下:
最后我們用程序來檢驗(yàn)一下看看方法一和方法二生成字符串的區(qū)別:
在檢驗(yàn)之前我們先對(duì)字符串中的兩種常用的比較方法進(jìn)行說明:str==str1,與str.equals(str1)的區(qū)別,str==str1是比較兩個(gè)字符串是否指向的是同一個(gè)實(shí)體,或者說是不是對(duì)同一個(gè)實(shí)體的引用,str.equals(str1),則僅僅是比較兩個(gè)字符串是否相同而不管他們是不是對(duì)同一個(gè)實(shí)體的引用。
public?class?StringTest?{???public?static?void?main(String[]?args)?{????????String?str="helloworld";????????String?str1="helloworld";????????String?str2=new?String("helloworld");????????String?str3=new?String("helloworld");????????System.out.println(":"+(str==str1));????????System.out.println(":"+(str1==str2));????????System.out.println(":"+(str2==str3));????????System.out.println(":"+str.equals(str3));????}?}輸出的結(jié)果如下::true:false:false:true
由此可知str與str1是引用的同一實(shí)體,而str2與str3引用的是不同實(shí)體。且str指向的字符串值與str3相同。
以上就是長(zhǎng)沙中公優(yōu)就業(yè)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“java string 字符類型定義的兩種方法”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。