为了账号安全,请及时绑定邮箱和手机立即绑定

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
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号