首先,分析这个问题从两方面:
一:堆内存
二:常量池
总结:如果有new关键字两个方面都分析,如果没有,只判断常量池就可解决问题。
分以下几种情况:
1,String str = "ab";
该语句创建对象的过程:先在常量池中查找是否有内容为"ab"的字符串对象,若有,直接将该对象的引用赋给str;若没有,则在常量池中创建"ab"对象,再将其引用赋给str。因为没有new关键字,所以操作的只有常量池。
2,String str = new String("ab");
该语句创建对象的过程:分两种情况,
- 先在常量池中查找是否有内容为“ab“的字符串对象,若有,直接将该对象的引用赋值给str;若没有,则在常量池中创建”ab“对象,再将其引用给str。
- 这里有new关键字,所以它会在堆内存中开辟空间,每次new的堆内存地址都不同。
- 所以这个要分两种情况去区分,不要单纯的以为就是两个对象
3,String str = new String("a"+"b");
这个地方有坑,javac编译时,会对其优化,变成"ab",不必等到运行期去进行加法运算处理。所以ab是一个对象,其他的就和上边的同理了。
4,String s = new String("a")+b;
分情况,new String("a")可能一个或两个,+b可能一个或没有, new String("a")+b一个,所以两到四个对象。