String 字符串相加求解

姜小白- 2014-03-07 12:31:10

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") 相加时存储空间的不同之处。
还望大家不吝赐教。
...全文
11229 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangmiaoy86 2014-03-12
  • 打赏
  • 举报
回复
引用 43 楼 magi1201 的回复:
[quote=引用 42 楼 zhangmiaoy86 的回复:] 楼主,str1 = "a"和“a”是不一样的,只是值一样,但是位置是不同的
你说的String str1 = "a" 和 “a" 不同,第二个”a" 是 ?[/quote] str1=“a” 这个str1是new出来的,值是"a" ,但是和被赋值的“a”是不相同的,只是值复制了,指向是不同的,“=”是要二个完全一样的才是true
姜小白- 2014-03-12
  • 打赏
  • 举报
回复
引用 42 楼 zhangmiaoy86 的回复:
楼主,str1 = "a"和“a”是不一样的,只是值一样,但是位置是不同的
你说的String str1 = "a" 和 “a" 不同,第二个”a" 是 ?
zhangmiaoy86 2014-03-12
  • 打赏
  • 举报
回复
引用 22 楼 magi1201 的回复:
[quote=引用 17 楼 zhangmiaoy86 的回复:] String s = "ab"; 这句是定义一个String变量s,jvm会先去字符串池中找有没有"ab",有的话就把s指向"ab",没有就会先在池中创建一个,再让s指向"ab"。 String s = new String("ab"); 这句是先定义一个String变量s,然后在内存中分配新的空间"ab"再让s指向这个内存地址。
回答不在点上,讲讲 str4 和 str5 的区别,两个都是相加,他们的相加有什么区别呢。[/quote] 楼主,str1 = "a"和“a”是不一样的,只是值一样,但是位置是不同的
浮云若水 2014-03-10
  • 打赏
  • 举报
回复
a+b =ab 首先 回去池里面找 ab 如果没有就会new 而str3 那已经把 ab创建了 所以str4 会直接指向 而不会new
u010840652 2014-03-10
  • 打赏
  • 举报
回复
没啥不同 编译器编译的时候成一个字符串
whos2002110 2014-03-10
  • 打赏
  • 举报
回复
引用 29 楼 osnot 的回复:
[quote=引用 14 楼 whos2002110 的回复:] 字面量的字符串会在编译器优化,"a" + "b" 编译期会直接优化成"ab", 前面已经s3 = "ab";所以引用s5的值在编译期就已经确定了指向"ab"; s1 + s2的结果无法在编译期确定(如果你把s1、s2定义为final类型,3个结果都是true了)
大牛啊,编译器优化,真的不知,至于str1+str2这样的句子会new一个String对象?不了解~盼大牛回复~[/quote] 这不是什么高深的东西,书上都有写。s1 + s2这里面设计到加号运算符重载,也是java里唯一的运算符重载。 对于String z = x + y; 具体实现大致是这样 StringBuilder temp = new StringBuilder(); temp.append(x); temp.append(y); String z = temp.toString(); 你可以断点到StringBuilder类里,看它的toString实现就明白了
逍遥jc 2014-03-10
  • 打赏
  • 举报
回复
引用 23 楼 magi1201 的回复:
[quote=引用 19 楼 u010111184 的回复:] 这是因为String4需要新的内存空间吧~指向的对象不同的缘故吧~
为什么str5 不需要新的内存空间呢[/quote] 因为a和b都是常量,a+b和ab都是在常量池的,str5并不需要新的内存空间就可以得到ab了。而str4先得开辟空间才行。
放纵的青春 2014-03-08
  • 打赏
  • 举报
回复
引用 14 楼 whos2002110 的回复:
字面量的字符串会在编译器优化,"a" + "b" 编译期会直接优化成"ab", 前面已经s3 = "ab";所以引用s5的值在编译期就已经确定了指向"ab"; s1 + s2的结果无法在编译期确定(如果你把s1、s2定义为final类型,3个结果都是true了)
太犀利了
kevinlifeng 2014-03-08
  • 打赏
  • 举报
回复
引用 14 楼 whos2002110 的回复:
字面量的字符串会在编译器优化,"a" + "b" 编译期会直接优化成"ab", 前面已经s3 = "ab";所以引用s5的值在编译期就已经确定了指向"ab"; s1 + s2的结果无法在编译期确定(如果你把s1、s2定义为final类型,3个结果都是true了)
高手 ~~~
姜小白- 2014-03-08
  • 打赏
  • 举报
回复
引用 32 楼 bao110908 的回复:
这种问题基本上是 Thinking in Java 看多了的才会去纠结
火龙果前辈好 最近开始看java虚拟机相关的东西,就正好碰到这个问题
  • 打赏
  • 举报
回复
这种问题基本上是 Thinking in Java 看多了的才会去纠结
momoaiyanzi 2014-03-08
  • 打赏
  • 举报
回复
String str4 = str1 + str2; String str5 = "a" + "b"; 一个是常量赋值,一个是变量赋值。 java 在编译的时候就知道"a"+"b"="ab" 了。在运行时才知道str1+str2 = "ab"
twtiqfn 2014-03-08
  • 打赏
  • 举报
回复
不错的小例子
osnot 2014-03-08
  • 打赏
  • 举报
回复
引用 14 楼 whos2002110 的回复:
字面量的字符串会在编译器优化,"a" + "b" 编译期会直接优化成"ab", 前面已经s3 = "ab";所以引用s5的值在编译期就已经确定了指向"ab"; s1 + s2的结果无法在编译期确定(如果你把s1、s2定义为final类型,3个结果都是true了)
大牛啊,编译器优化,真的不知,至于str1+str2这样的句子会new一个String对象?不了解~盼大牛回复~
jenly10 2014-03-08
  • 打赏
  • 举报
回复
姜小白- 2014-03-08
  • 打赏
  • 举报
回复
引用 36 楼 u012973297 的回复:
[quote=引用 32 楼 bao110908 的回复:] 这种问题基本上是 Thinking in Java 看多了的才会去纠结
对的, 我觉得楼主还是去看语言规范吧(The Java™ Language Specification Third Edition),在 3.10.5节(我的是第三版),解释了 字符串字面量对于编辑期间和运行时的处理,另外,貌似这些是 java规定的有时不用太过纠结,因为这个只是规范,不不是所有的 VM实现都一样的,那时 jvm的事.[/quote] 嘿嘿 谢谢推荐 回头去书店看看你讲的那本书 现在看的是JVM处理的一些事情
kjulistened 2014-03-08
  • 打赏
  • 举报
回复
引用 32 楼 bao110908 的回复:
这种问题基本上是 Thinking in Java 看多了的才会去纠结
对的, 我觉得楼主还是去看语言规范吧(The Java™ Language Specification Third Edition),在 3.10.5节(我的是第三版),解释了 字符串字面量对于编辑期间和运行时的处理,另外,貌似这些是 java规定的有时不用太过纠结,因为这个只是规范,不不是所有的 VM实现都一样的,那时 jvm的事.
姜小白- 2014-03-07
  • 打赏
  • 举报
回复
引用 5 楼 aidashi 的回复:
我艹String str5 = "a" + "b";不是new的,也是在String池中
我的疑惑点也在这里
  • 打赏
  • 举报
回复
我艹String str5 = "a" + "b";不是new的,也是在String池中
姜小白- 2014-03-07
  • 打赏
  • 举报
回复
引用 2 楼 l359122505 的回复:
回答问题呗,给点思路。
加载更多回复(23)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧