1.如果常量池有“abc”,则直接copy到堆内存,str指向的是在堆内存创建的对象。这个时候只创建一个对象
2.如果常量池没有“abc”,则先创建新的String对象“abc”放入到常量池中,然后new String("abc")的时候,将常量池中的对象copy到堆内存,str指向的是在堆内存创建的对象。这个时候创建的是两个对象,一个是常量池里面的,一个是new String的。
参考:
https://blog.csdn.net/liutong1995/article/details/53379943
https://blog.csdn.net/limingchuan123456789/article/details/14150327