一个String相加的神奇问题 string相加== 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 楼主你比较的是字符串地址,如果是比较内容的话应该用equals 编译器会做优化的,比如 int i=2+3 那么实际字节码就是 int i=5 而不是在运行期再算一遍 1L说的很清楚,你比较的是地址,关于第二个代码2L也说的很清楚,编译器的优化,Str2=”a“+”b“ 对于编译器来说其实就是Str2=“ab”,压根就不算拼接 String str1 = "a";String str2 = "b";String str3 = "ab";String str4 = str1 + str2;System.out.println(str3 == str4);其实,“a”、"b"、"ab"这三个都是在字符串池中创建的,而str1、str2、str3、str4这些都是存在于堆空间的地址,指向于字符串池中的字符串。 当你比较str3==str4的时候,比较的并不是字符串池中的 字符串,而是存在于堆空间的地址..所以是false..当然,如果想要为true也容易,用equals就是.String str1 = "ab";String str2="a"+"b";System.out.println(str1 == str2);这两个的区别就是你后面的赋值,你是直接把str1和str2同时指向了字符串池中的"ab"。所以他们两个的地址是一样的~ so, true希望能对楼主有帮助,别被我说晕了啊~ 哈哈 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=335088&page=1#pid4051788 这个是我在eoe发的帖子。 是同一个问题。 请大家看下。 有人说String s=new String("aaa"); 会在普通对象堆中和字符串永久区中都创建一块“aaa”的内存。 不知道有没有人有异议。 谢谢大家回答! 代码1 的 string1 string2 在不同的堆上,代码2的 string2 是在同一个堆上进行的操作 java比字符串值是否相同用的是.equals()代码2打印true的原因是编译器优化 第一个是地址不同 所以返回false; 第二个是由于相加后发现string池中有相同的字符串 所以不会再开一个地址~ 所以地址是相同的 所以返回true 请教一下spring的jdbcTemplate的一个问题 struts2+spring+ibatis如何存取oracle的blob字段 Struts的DynaActionForm问题 求教:java中如何利用反射创建变量? 请大家为我推荐几本好书? 一个关于xquery查询的问题,急! subversion在公司adsl安装后(IP不固定,局域网),如何在家访问? 请教一个问题,谢谢大家 另一个class怎么调用 返回map集合里的list?急急急,100高分 java微信公众号开发 maven编译工程出现异常 Mysql 用MyBatis Generator 生成代码时 报如下错误!
String str2 = "b";
String str3 = "ab";
String str4 = str1 + str2;System.out.println(str3 == str4);其实,“a”、"b"、"ab"这三个都是在字符串池中创建的,而str1、str2、str3、str4这些都是存在于堆空间的地址,指向于字符串池中的字符串。 当你比较str3==str4的时候,比较的并不是字符串池中的 字符串,而是存在于堆空间的地址..所以是false..当然,如果想要为true也容易,用equals就是.
String str1 = "ab";
String str2="a"+"b";
System.out.println(str1 == str2);这两个的区别就是你后面的赋值,你是直接把str1和str2同时指向了字符串池中的"ab"。所以他们两个的地址是一样的~ so, true希望能对楼主有帮助,别被我说晕了啊~ 哈哈
代码2打印true的原因是编译器优化