日期:2014-05-20  浏览次数:20687 次

String 字符串相加求解
本帖最后由 magi1201 于 2014-03-07 12:35:16 编辑

String str1 = "a";
String str2 = "b";
String str3 = "ab";
String str4 = str1 + str2;
String str5 = "a" + "b";
System.out.println("str3 == str4 " + (str3 == str4));
System.out.println("str3 == str5 " + (str3 == str5));
System.out.println("str4 == str5 " + (str4 == str5));


对于结果

str3 == str4 false
str3 == str5 true
str4 == str5 false


想知道下(str1 + str2) 和 ("a" + "b") 相加时存储空间的不同之处。
还望大家不吝赐教。

------解决方案--------------------
像这种"a"、"b"直接赋值给别人的,没有经过new的,是被存在String池的,有自己单独的存储空间
而new出来的是在堆区。
当String str1 = "a";后,若再有一个String str2 = "a";时,str1 和str2指向是一样的,即str1==str2为真。
若是String str1 = "a";后有String str2 = new String("a");则str1!=str2
String str4 = str1 + str2; 和String str5 = "a" + "b";其实都是new出来的,即使值相同地址也会不同
------解决方案--------------------

------解决方案--------------------
引用:
Quote: 引用:

我艹String str5 = "a" + "b";不是new的,也是在String池中
我的疑惑点也在这里 

是不是因为“a”“b”都是静态的不可改变,所以str5就引用了静态区的,由于那两个变量相加,他们说引用的值可能变化,所以str4在动态区
我猜的
------解决方案--------------------
‘==’既比较内容也比较地址,前一个存的是引用,后一个存的是内容,肯定地址不一样了。。如果改为equals那么就是true了,
------解决方案--------------------
是个问题
------解决方案--------------------
又是这月经问题
------解决方案--------------------
引用:
Quote: 引用:

‘==’既比较内容也比较地址,前一个存的是引用,后一个存的是内容,肯定地址不一样了。。如果改为equals那么就是true了,
请解释 str4 和 str5 的区别,一个是通过变量名相加,一直通过变量值相加,这个区别在哪里 


内存分配的地址肯定不同了。。一个是引用,一个是内容,存在哪?,怎么分配 ?我不知道。
------解决方案--------------------
字面量的字符串会在编译器优化,"a" + "b" 编译期会直接优化成"ab", 前面已经s3 = "ab";所以引用s5的值在编译期就已经确定了指向"ab"; 
s1 + s2的结果无法在编译期确定(如果你把s1、s2定义为final类型,3个结果都是true了)
------解决方案--------------------
引用:
字面量的字符串会在编译器优化,"a" + "b" 编译期会直接优化成"ab", 前面已经s3 = "ab";所以引用s5的值在编译期就已经确定了指向"ab"; 
s1 + s2的结果无法在编译期确定(如果你把s1、s2定义为final类型,3个结果都是true了)

------解决方案--------------------
String s = "ab";
这句是定义一个String变量s,jvm会先去字符串池中找有没有"ab",有的话就把s指向"ab",没有就会先在池中创建一个,再让s指向"ab"。
String s = new String("ab");
这句是先定义一个String变量s,然后在内存中分配新的空间"ab"再让s指向这个内存地址。
------解决方案--------------------
引用:
Quote: 引用:

 回答问题呗,给点思路。
木有思路,纠结这问题没啥意义
------解决方案--------------------
这是因为String4需要新的内存空间吧~指向的对象不同的缘故吧~
------解决方案--------------------
来看回复的。
------解决方案--------------------
记得是编译器的优化,
我是来学习的
------解决方案--------------------
我去   高深了~~
------解决方案--------------------
我是来看大神回答的
------解决方案--------------------

引用:
String s = "ab";
这句是定义一个String变量s,jvm会先去字符串池中找有没有"ab",有的话就把s指向"ab",没有就会先在池中创建一个,再让s指向"ab"。
String s = new String("ab");
这句是先定义一个String变量s,然后在内存中分配新的空间"ab"再让s指向这个内存地址。


+1
------解决方案--------------------

------解决方案--------------------
引用:
字面量的字符串会在编译器优化,"a" + "b" 编译期会直接优化成"ab", 前面已经s3 = "ab";所以引用~
------解决方案--------------------
不错的小例子
------解决方案--------------------
String str4 = str1 + str2;
String str5 = "a" + "b";
一个是常量赋值,一个是变量赋值。
java 在编译的时候就知道"a"+"b"="ab" 了。在运行时才知道str1+str2 = "ab"
------解决方案--------------------
这种问题基本上是 Thinking in Java 看多了的才会去纠结