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

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