String str = new String(“abc”)创建了几个变量?
我的答案是1个或者2个
为什么呢?流程大概如下
-
在常量池中查找是否有“abc”对象
-
有则返回对应的引用实例
-
没有则创建对应的实例对象
-
-
在堆中 new 一个 String(“abc”) 对象
-
将对象地址赋值给str4,创建一个引用
所以常量池有"abc"就只创建了一个实例对象,否则会多在常量池中多创建一个对象
那String str1 = new String(“A”+“B” ) 会创建多少个对象?
我认为是和上面一样
因为编译器会自动优化
成
String str1 = new String(“AB”) ;
可以从字节码的角度看出来
public static main([Ljava/lang/String;)V
L0
LINENUMBER 11 L0
NEW java/lang/String
DUP
LDC "AB"
INVOKESPECIAL java/lang/String.<init> (Ljava/lang/String;)V
ASTORE 1
L1
LINENUMBER 12 L1
RETURN
L2
LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
LOCALVARIABLE s Ljava/lang/String; L1 L2 1
MAXSTACK = 3
MAXLOCALS = 2
}
ps:字符串常量池在哪里?方法区?
jdk1.6有方法区。方法区里有运行时常量池
,这时期字符串常量池
在运行时常量池中,静态变量也在方法区中.。
jdk1.7把字符串常量池和静态变量放到堆里去了
。
jdk1.8把方法区改成了元空间
从虚拟机内存中独立出去到本地内存了,但字符串常量池
池还在堆
中
而运行时常量池
移动到了元空间
。
当然,以上所有只是个人通过阅读其他大佬的文章总结而来,欢迎大家讨论!