String 字符串相加求解 本帖最后由 magi1201 于 2014-03-07 12:35:16 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 像这种"a"、"b"直接赋值给别人的,没有经过new的,是被存在String池的,有自己单独的存储空间而new出来的是在堆区。当String str1 = "a";后,若再有一个String str2 = "a";时,str1 和str2指向是一样的,即str1==str2为真。若是String str1 = "a";后有String str2 = new String("a");则str1!=str2String str4 = str1 + str2; 和String str5 = "a" + "b";其实都是new出来的,即使值相同地址也会不同 解释的不太对吧,str3 == str5 是true . 现在就想知道,str4 和 str5 一个是字符串直接相加,一个是变量名相加,这两者有何不同,还望不吝赐教 我艹String str5 = "a" + "b";不是new的,也是在String池中 是不是因为“a”“b”都是静态的不可改变,所以str5就引用了静态区的,由于那两个变量相加,他们说引用的值可能变化,所以str4在动态区我猜的 ‘==’既比较内容也比较地址,前一个存的是引用,后一个存的是内容,肯定地址不一样了。。如果改为equals那么就是true了, 请解释 str4 和 str5 的区别,一个是通过变量名相加,一直通过变量值相加,这个区别在哪里 字面量的字符串会在编译器优化,"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指向这个内存地址。 这是因为String4需要新的内存空间吧~指向的对象不同的缘故吧~ 回答不在点上,讲讲 str4 和 str5 的区别,两个都是相加,他们的相加有什么区别呢。 为什么str5 不需要新的内存空间呢 大牛啊,编译器优化,真的不知,至于str1+str2这样的句子会new一个String对象?不了解~盼大牛回复~ String str4 = str1 + str2;String str5 = "a" + "b";一个是常量赋值,一个是变量赋值。java 在编译的时候就知道"a"+"b"="ab" 了。在运行时才知道str1+str2 = "ab" 这种问题基本上是 Thinking in Java 看多了的才会去纠结 火龙果前辈好 最近开始看java虚拟机相关的东西,就正好碰到这个问题 对的,我觉得楼主还是去看语言规范吧(The Java™ Language Specification Third Edition),在 3.10.5节(我的是第三版),解释了 字符串字面量对于编辑期间和运行时的处理,另外,貌似这些是 java规定的有时不用太过纠结,因为这个只是规范,不不是所有的 VM实现都一样的,那时 jvm的事. 对的,我觉得楼主还是去看语言规范吧(The Java™ Language Specification Third Edition),在 3.10.5节(我的是第三版),解释了 字符串字面量对于编辑期间和运行时的处理,另外,貌似这些是 java规定的有时不用太过纠结,因为这个只是规范,不不是所有的 VM实现都一样的,那时 jvm的事. 嘿嘿 谢谢推荐 回头去书店看看你讲的那本书 现在看的是JVM处理的一些事情 大牛啊,编译器优化,真的不知,至于str1+str2这样的句子会new一个String对象?不了解~盼大牛回复~这不是什么高深的东西,书上都有写。s1 + s2这里面设计到加号运算符重载,也是java里唯一的运算符重载。对于String z = x + y; 具体实现大致是这样StringBuilder temp = new StringBuilder();temp.append(x);temp.append(y);String z = temp.toString();你可以断点到StringBuilder类里,看它的toString实现就明白了 a+b =ab 首先 回去池里面找 ab 如果没有就会new 而str3 那已经把 ab创建了所以str4 会直接指向 而不会new 为什么str5 不需要新的内存空间呢因为a和b都是常量,a+b和ab都是在常量池的,str5并不需要新的内存空间就可以得到ab了。而str4先得开辟空间才行。 楼主,str1 = "a"和“a”是不一样的,只是值一样,但是位置是不同的 你说的String str1 = "a" 和 “a" 不同,第二个”a" 是 ? 你说的String str1 = "a" 和 “a" 不同,第二个”a" 是 ?str1=“a” 这个str1是new出来的,值是"a" ,但是和被赋值的“a”是不相同的,只是值复制了,指向是不同的,“=”是要二个完全一样的才是true java list 排序问题 如何将字符串倒序输出? 是高手就请进>>>跪求备份数据库问题,在线ing.... 一段代码目的是打印2点成一条直线,出了点问题 谁有JBulider啊,急需.谢谢了!!! 字符串处理的简单问题 请求帮助:我是一个JAVA初学者 一个页面刷新的简单问题 如何根据<select>的选择改变button的value和enable??<javascript> 我的jdk怎么了? xml递归解析 求助netbeans 问题
而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出来的,即使值相同地址也会不同
我猜的
s1 + s2的结果无法在编译期确定(如果你把s1、s2定义为final类型,3个结果都是true了)
这句是定义一个String变量s,jvm会先去字符串池中找有没有"ab",有的话就把s指向"ab",没有就会先在池中创建一个,再让s指向"ab"。
String s = new String("ab");
这句是先定义一个String变量s,然后在内存中分配新的空间"ab"再让s指向这个内存地址。
String str5 = "a" + "b";
一个是常量赋值,一个是变量赋值。
java 在编译的时候就知道"a"+"b"="ab" 了。在运行时才知道str1+str2 = "ab"
最近开始看java虚拟机相关的东西,就正好碰到这个问题
我觉得楼主还是去看语言规范吧(The Java™ Language Specification Third Edition),在 3.10.5节(我的是第三版),解释了 字符串字面量对于编辑期间和运行时的处理,另外,貌似这些是 java规定的有时不用太过纠结,因为这个只是规范,不不是所有的 VM实现都一样的,那时 jvm的事.
我觉得楼主还是去看语言规范吧(The Java™ Language Specification Third Edition),在 3.10.5节(我的是第三版),解释了 字符串字面量对于编辑期间和运行时的处理,另外,貌似这些是 java规定的有时不用太过纠结,因为这个只是规范,不不是所有的 VM实现都一样的,那时 jvm的事. 嘿嘿 谢谢推荐 回头去书店看看你讲的那本书 现在看的是JVM处理的一些事情
这不是什么高深的东西,书上都有写。s1 + s2这里面设计到加号运算符重载,也是java里唯一的运算符重载。
对于String z = x + y; 具体实现大致是这样
StringBuilder temp = new StringBuilder();
temp.append(x);
temp.append(y);
String z = temp.toString();
你可以断点到StringBuilder类里,看它的toString实现就明白了
所以str4 会直接指向 而不会new
因为a和b都是常量,a+b和ab都是在常量池的,str5并不需要新的内存空间就可以得到ab了。而str4先得开辟空间才行。
str1=“a” 这个str1是new出来的,值是"a" ,但是和被赋值的“a”是不相同的,只是值复制了,指向是不同的,“=”是要二个完全一样的才是true