String str1 = "abc"; 0个或1个
当直接赋值时,字符串“abc”的引用会被存储在常量池中,只有1份,此时的赋值操作等于是创建0个或1个对象。
如果常量池中已经存在了“abc
的引用”,那么不会再创建对象,直接将引用赋值给str1;
如果常量池中没有“abc”的引用
,那么在堆上创建一个abc对象
,同时将对象的引用保存在字符串常量池,
并将引用赋值给str1。
String str2 = new String("abc"); 1个或2个。
当JVM遇到上述代码时,会先检索常量池中是否存在“abc”的引用
,如果不存在“abc”的引用,则会先在堆中创建这个一个字符串对象,同时保存对象引用到字符串常量池
。然后再执行new操作,会在堆内存中创建一个存储“abc”的String对象
,对象的引用赋值给str2
。此过程在堆上创建了2个对象
。