为什么两个Sting类型变量相加,结果不需要new呢?

为什么两个Sting类型变量相加,结果不需要new呢?s = new String(s1) + new String(s2)和s = s1 + s2分别创建了几个字符串常量?

语法就是这么规定的,s = new String(s1) + new String(s2)是绕了一个圈子,多创建两个String对象。

可以使用StringBuffer或者Stringbuilder,String无论你new不new,即便是你String s=“”这里也是存在了两个对象。StringBuffer、Stringbuilder是可控字符串变量,需要连接的时候只需要使用append();不会占用内存空间

字符串的操作,底层的原理,用javap反编译看下字节码就能明白了。建议有空了解下JVM底层的知识。

举例来说吧;
平时你写 String str1="hello"; ,String str2 = "world"; ,new了吗?没有吧!那两者之和 String str = str1+str2; 也是同样道理了。

在java中,字符串的加法是如何实现的? http://www.2cto.com/kf/201301/180600.html

s = new String(s1) + new String(s2)是绕了一个圈子,多创建两个String对象。
s = s1 + s2 创建了s1、s2和他们拼接之后的s

先回答你的问题吧 你两个string相加他默认会帮你自动new的,只是你看不见而已

s = new String(s1) + new String(s2)是两个对象是在堆里面创建的

还有跟你说 String 类型的都是常量 值是不可变的 你看到的只是换了一个值string s1 = "123" 其实是把"123"存在常量池里面了 s1 = "456"
虽然你看上去值不一样了 其实是不同了的 "123"其实还是存在的 存在在常量池里面

stringbuffer或者stringbuilder才是string类型的变量类型

对于c++而言:
string作为一种类型,它本身的实现为堆内存动态开辟的空间,但是string类型的对象作为运行时栈内存变量,而str = str1 + str2;这句代码之所以
正确是因为string类本身实现了‘+’运算符重载,而str1跟str2也均是栈区变量(底层实现:将堆内存数据拷贝到栈内存实现了c++的封装特性)