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

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