String s=new String("abc");创建了几个字符串对象?

创建了2个对象

1个是静态常量池中的"abc"

1个是new 创建的堆中的对象。

使用javap -c 命令反编译查看指令的运行过程

String s=new String(”abc“);创建了几个字符串对象?

第0和第4的操作地址不一样,那么就是创建了2个对象。

如果代码变成了

String s1= "abc";
String s = new String("abc");
那么这个时候String s=new String("abc");创建了1个对象。

因为在s1="abc"中已经将"abc"放入常量池中了,这个时候只会new一个对象,不会再把"abc"放到常量池中了,因为它已经存在了。

使用javap -c 命令反编译查看指令的运行过程

String s=new String(”abc“);创建了几个字符串对象?

其中第0和第7的操作地址一样,说明abc创建了一次。因为前面的String s1= "abc";操作已经把abc放入常量池中了。