亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

s3 和s4與s1和s2有和不同,為什么一個地址相同,一個不同?

http://img1.sycdn.imooc.com//55391be10001e85405270114.jpg

s3 和s4與s1和s2有和不同,為什么一個地址相同,一個不同?http://img1.sycdn.imooc.com//55391c75000105d402150050.jpg

正在回答

4 回答

? 字符串存儲的地方有兩種,分別是

  1. 常量池

  2. 堆內存

? 我們在程序中通常會用以下四種方式來創建字符串,現在我分別說說這四種創建方式創建的字符串分別存儲到什么地方:

  1. String?s?=?new?String("imooc");??
    /*
    存儲到堆中,首先會判斷池中是否有該字符串,如果有,則從池中復制一份到堆中,將堆中的地址返回引用對象;如果沒有,則在堆中創建一份,返回堆中的地址給引用對象。
    */
  2. String?s?=?"imooc";
    /*
    存儲到常量池中,首先判斷池中是否有該字符串,如果有,則從池中返回地址給引用對象;如果沒有,則從池中創建該字符串,然后返回池中的地址給引用對象。
    */
  3. String?s?=?"I?love?"?+?"imooc";
    /*
    存儲到常量池中,首先判斷池中是否有該字符串,如果有,則從池中返回地址給引用對象;如果沒有,則從池中創建該字符串,然后返回池中的地址給引用對象。
    */
  4. String?s1?=?"I?love";
    String?s2?=?s1?+?"imooc";
    /*
    存儲到堆中,首先會判斷池中是否有該字符串,如果有,則從池中復制一份到堆中,將堆中的地址返回引用對象;如果沒有,則在堆中創建一份,返回堆中的地址給引用對象。
    */


    參考地址:Java中的String與常量池





0 回復 有任何疑惑可以回復我~

http://blog.csdn.net/cs_lht/article/details/6742531

1 回復 有任何疑惑可以回復我~
#1

蒼白的沉淀

這個連接里面的文章中提到了“字符數據池”的內存管理機制。字符數據池也是屬于堆內存么,還是說它只是堆內存機制里面的一個概念?感覺說的挺有道理,但是仔細想想又覺得有點懵。。。。。
2015-07-12 回復 有任何疑惑可以回復我~
#2

deziko 回復 蒼白的沉淀

字符數據池并不屬于堆內存中,它是屬于常量存儲范疇的,具體可以看《Java編程思想》的第2章。
2015-08-31 回復 有任何疑惑可以回復我~

你可以在網上搜一下字符串池和堆內存,這樣便于理解

1 回復 有任何疑惑可以回復我~

你可以這么理解

你在內存中開辟了一塊空間,這塊空間中存放的是"imooc",當你定義變量的時候,就會檢測內存中是否存在該字符串,如果存在的話直接引用就OK了,這也就是為什么s1和s2的地址一樣了。就是因為在創建s1之后,在內存中已經有"imooc"這個字符串了,那么再創建s2的時候,自動去查內存中是否有相同的字符串,所以他倆就相等。

而為什么s3和s4不相等呢,是因為字符串一旦創建,就不會改變,也就是你在做字符串拼接的時候,會創建一個新的字符串對象,也就是會另外開辟一塊空間,用來存放所新創建的字符串。所以s3是一個新的地址,而s4也是一個新的地址

7 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

s3 和s4與s1和s2有和不同,為什么一個地址相同,一個不同?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號