本文主要是介绍String sb = new String(sb);到底创建了几个实例?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
String sb = new String(“sb”);到底创建了几个实例?
很多人都在讨论这个问题,当然这个问题是没有什么意义的。但是如果可以学到新的知识,那讨论便有了意义。
之前博主不知道如何查看字节码,最近看了一些文章。本文将从字节码的角度分析这个问题。
对于这个问题,不考虑特殊情况是2个。
1.一个是字符串字面量”sb”所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例。
2.通过new String(String)创建并初始化的、内容与”sb”相同的实例。
下面我们通过例子来感知下。
很简单的例子。
通过:
javac identity.java.
然后:
对生成的identity.class字节码文件进行反汇编。
javap指令。
javap -c identity.class
结果如下图:
这就是字节码执行的步骤。
先看下java指令的意思。
1.new 创建一个对象,并将其引用值压入栈顶
2.dup 复制栈顶数值并将复制值压入栈顶
3.ldc 将int, float或String型常量值从常量池中推送至栈顶
4.invokespecial 调用超类构造方法,实例初始化方法,私有方法(初始化)
5.putfield 为指定的类的实例域赋值
而对于我们重要的就是
new和ldc指令。new执行了一次,创建了String对象。ldc执行了一次,从常量池中推送至栈顶。
很明显,有两个。
通过字节码的解释到此结束。
链接
java指令表格
当然关于此类的讨论是没什么太多意义的,当然对于这个问题的问法,也会有不同的答案。
比如:在运行时,有几个实例。
那么这个答案就不一定了。因为不同的jvm虚拟机在编译时会做优化,所以到运行时,为了更好的运行,有些早已给gc掉了。这在不同的jvm虚拟机上可能结果是不同的。
附上大神的解释
关于问题的解释
Ending.
这篇关于String sb = new String(sb);到底创建了几个实例?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!