问题:new String("abc") 到底是创建了几个字符串对象?
不考虑字符串常量池中已有的字符串“abc”的情况,答案是会创建两个字符串对象
new和双引号""是两种创建字符串的方式
1、双引号方式创建字符串
双引号创建时,先去字符串常量池找,如果有,直接返回其引用,如果没有,则在字符串常量池中创建新的字符串对象引用,并返回该引用。这个字符串对象本身是在堆内存中分配的。(这块注意,很多人经常说字符串对象是在字符串常量池中的,常量池中的只是引用,对象本身是在堆中的)
2、使用new关键字创建字符串
使用new方式创建的字符串对象和正常创建对象的流程是一样的,直接在堆中分配内存,创建一个新的对象,不会去常量池中找。
3、总结
所以说new String("abc"),不考虑字符串常量池中已有abc的情况下,会创建两个字符串对象
第一次是双引号"abc"方式,字符串常量池中创建引用指向堆中新创建的字符串对象。
第二次是new方式在堆中创建的另一个字符串对象
那字符串常量池中的到底是哪一个?
那字符串常量池中存放的就是双引号方式创建的那个对象的引用,并不是对象本身
补充:字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。