s3 和s4与s1和s2有和不同,为什么一个地址相同,一个不同?
字符串存储的地方有两种,分别是
常量池
堆内存
我们在程序中通常会用以下四种方式来创建字符串,现在我分别说说这四种创建方式创建的字符串分别存储到什么地方:
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
你可以在网上搜一下字符串池和堆内存,这样便于理解
你可以这么理解
你在内存中开辟了一块空间,这块空间中存放的是"imooc",当你定义变量的时候,就会检测内存中是否存在该字符串,如果存在的话直接引用就OK了,这也就是为什么s1和s2的地址一样了。就是因为在创建s1之后,在内存中已经有"imooc"这个字符串了,那么再创建s2的时候,自动去查内存中是否有相同的字符串,所以他俩就相等。
而为什么s3和s4不相等呢,是因为字符串一旦创建,就不会改变,也就是你在做字符串拼接的时候,会创建一个新的字符串对象,也就是会另外开辟一块空间,用来存放所新创建的字符串。所以s3是一个新的地址,而s4也是一个新的地址