我們來(lái)看一段再經(jīng)典不過(guò)的程序:
class StringTest
{
public static void main(String[] args)
{
String s=new String("abc");
String s1="abc";
String s2=new String("abc");
System.out.println(s==s1);
System.out.println(s1==s2);
System.out.println(s==s2);
}
}
大伙兒都知道內(nèi)存中有兩塊兒存儲(chǔ)區(qū)域,分別是棧和堆,加上JAVA字符串是由字符串池管理的,所以,我們的內(nèi)存可以這樣劃分:
程序開(kāi)始前所有區(qū)域都是空的,現(xiàn)在我們執(zhí)行第一條語(yǔ)句
?
????? String?s= new ?String( "abc" );??
?
????? JAVA執(zhí)行流程是這樣的。首先判斷字符串池里有沒(méi)有值為"abc"的對(duì)象,由于這行語(yǔ)句實(shí)在程序第一句,字符串池是空的,所以,它會(huì)現(xiàn)在字符串池里構(gòu)造一個(gè)值為"abc"的對(duì)象,然后執(zhí)行new語(yǔ)句后,再把“abc”拷貝到堆里面,關(guān)于一個(gè)new String構(gòu)造方法解釋.
?????? 然后s再指向這個(gè)對(duì)象,如圖:
所以說(shuō),執(zhí)行完這一行代碼后生成了兩個(gè)對(duì)象,一個(gè)是在字符串池里,一個(gè)是在堆里
然后看第二句:
- String?s1= "abc" ;??
????? ?執(zhí)行到這一句時(shí)又產(chǎn)生了幾個(gè)對(duì)象?答案是一個(gè)也沒(méi)產(chǎn)生!執(zhí)行是這樣的,當(dāng)程序看到"abc"后,會(huì)先到字符串池里找看有沒(méi)有"abc",由于執(zhí)行完第一行語(yǔ)句后字符串池里已經(jīng)有"abc"了就不再創(chuàng)建,注意這里并沒(méi)有new的操作,而是直接常量賦值,所以s1會(huì)直接指向這個(gè)"abc"而不會(huì)在堆里產(chǎn)生新的對(duì)象,如圖
程序接著往下走
- String?s2= new ?String( "abc" );??
???? ?這次又產(chǎn)生了幾個(gè)對(duì)象,一個(gè)!
????? 程序還是會(huì)現(xiàn)在字符串池里找"abc",發(fā)現(xiàn)有,就不再字符串池里產(chǎn)生新的對(duì)象了,接著執(zhí)行new操作,記著,在JAVA中,只要出現(xiàn)new操作,一定會(huì)有新的對(duì)象產(chǎn)生,不管這個(gè)對(duì)象是否存在多少次,所以它又會(huì)在堆里生成一個(gè)內(nèi)容為"abc"的對(duì)象,如圖
?
好了,只剩下比較了,注意這里是用的是==,在JAVA中,==永遠(yuǎn)是比較兩個(gè)引用是否指向同一個(gè)對(duì)象的,看到上圖,答案不用再揭曉了吧
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
