String sb = new String("sb");到底创建了几个实例?

来源:互联网 发布:淘宝集运澳洲怎么收费 编辑:程序博客网 时间:2024/05/17 22:47

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.

0 0
原创粉丝点击