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 看多了的才会去纠结