課程
/后端開發
/Java
/Java入門第三季
s3 和s4與s1和s2有和不同,為什么一個地址相同,一個不同?
2015-04-24
源自:Java入門第三季 2-2
正在回答
? 字符串存儲的地方有兩種,分別是
常量池
堆內存
? 我們在程序中通常會用以下四種方式來創建字符串,現在我分別說說這四種創建方式創建的字符串分別存儲到什么地方:
String?s?=?new?String("imooc");?? /* 存儲到堆中,首先會判斷池中是否有該字符串,如果有,則從池中復制一份到堆中,將堆中的地址返回引用對象;如果沒有,則在堆中創建一份,返回堆中的地址給引用對象。 */
String?s?=?"imooc"; /* 存儲到常量池中,首先判斷池中是否有該字符串,如果有,則從池中返回地址給引用對象;如果沒有,則從池中創建該字符串,然后返回池中的地址給引用對象。 */
String?s?=?"I?love?"?+?"imooc"; /* 存儲到常量池中,首先判斷池中是否有該字符串,如果有,則從池中返回地址給引用對象;如果沒有,則從池中創建該字符串,然后返回池中的地址給引用對象。 */
String?s1?=?"I?love"; String?s2?=?s1?+?"imooc"; /* 存儲到堆中,首先會判斷池中是否有該字符串,如果有,則從池中復制一份到堆中,將堆中的地址返回引用對象;如果沒有,則在堆中創建一份,返回堆中的地址給引用對象。 */
參考地址:Java中的String與常量池
http://blog.csdn.net/cs_lht/article/details/6742531
蒼白的沉淀
deziko 回復 蒼白的沉淀
你可以在網上搜一下字符串池和堆內存,這樣便于理解
你可以這么理解
你在內存中開辟了一塊空間,這塊空間中存放的是"imooc",當你定義變量的時候,就會檢測內存中是否存在該字符串,如果存在的話直接引用就OK了,這也就是為什么s1和s2的地址一樣了。就是因為在創建s1之后,在內存中已經有"imooc"這個字符串了,那么再創建s2的時候,自動去查內存中是否有相同的字符串,所以他倆就相等。
而為什么s3和s4不相等呢,是因為字符串一旦創建,就不會改變,也就是你在做字符串拼接的時候,會創建一個新的字符串對象,也就是會另外開辟一塊空間,用來存放所新創建的字符串。所以s3是一個新的地址,而s4也是一個新的地址
舉報
Java中你必須懂得常用技能,不容錯過的精彩,快來加入吧
1 回答為什么s1與s2比較 顯示TURE s1 。 s3,s3和s4的比較結果為FALSE?
1 回答為什么我比較s3和s4的內容是不相同的?
3 回答為什么?s1==s2是true,s3==s4是false
2 回答例子中的s3和s4怎么又不是同一對象了
1 回答為什么s1 == s2是true s3==s4是false
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2015-08-31
? 字符串存儲的地方有兩種,分別是
常量池
堆內存
? 我們在程序中通常會用以下四種方式來創建字符串,現在我分別說說這四種創建方式創建的字符串分別存儲到什么地方:
參考地址:Java中的String與常量池
2015-07-03
http://blog.csdn.net/cs_lht/article/details/6742531
2015-04-24
你可以在網上搜一下字符串池和堆內存,這樣便于理解
2015-04-24
你可以這么理解
你在內存中開辟了一塊空間,這塊空間中存放的是"imooc",當你定義變量的時候,就會檢測內存中是否存在該字符串,如果存在的話直接引用就OK了,這也就是為什么s1和s2的地址一樣了。就是因為在創建s1之后,在內存中已經有"imooc"這個字符串了,那么再創建s2的時候,自動去查內存中是否有相同的字符串,所以他倆就相等。
而為什么s3和s4不相等呢,是因為字符串一旦創建,就不會改變,也就是你在做字符串拼接的時候,會創建一個新的字符串對象,也就是會另外開辟一塊空間,用來存放所新創建的字符串。所以s3是一個新的地址,而s4也是一個新的地址