java 反编译 abc_Java中"abc"和new String("abc")有什么区别?

本篇文章给大家带来的内容是关于Java中"abc"和new String("abc")有什么区别?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

Java工程师面试官偏爱的问题之一,就是"abc"和 new String("abc")的区别是什么?回答的比较好的会带出Java堆,栈,常量池,引用等概念。但今天不止如此,我们从指令的角度,去看这个问题。

正文

我们知道,java类编译后的字节码是个二进制文件,不是给人而是给机器阅读的。但是java有一个javap的指令,可以把字节码翻译成人类能看懂的东西。

javap是 Java class文件分解器,可以反编译(即对javac编译的文件进行反编译),也可以查看java编译器生成的字节码。用于分解class文件。

现在有一个类,定义入下public class A01 {

public static void main(String ... args){

String a = "123";

String c = new String("123");

}

}

先用javac A01.java编译成字节码,再使用javap -c A01.class进行反编译。得到入下文本Compiled from "A01.java"

public class javap.A01 {

public javap.A01();

Code:

0: aload_0

1: invokespecial #1 // Method java/lang/Object."":()V

4: return

public static void main(java.lang.String...);

Code:

0: ldc #2 // String 123

2: astore_1

3: new #3 // class java/lang/String

6: dup

7: ldc #2 // String 123

9: invokespecial #4 // Method java/lang/String."":(Ljava/lang/String;)V

12: astore_2

13: return

}

我们主要看下面这段关于main方法的文本,里面涉及的指令不多,我整理了一下

ldc:将常亮加载到操作数栈

astore_1: 将栈顶元素的值保存到变量1

new: 为要创建的类实例开辟内存空间,并将地址压入操作数栈

dup: 复制操作数栈顶值,并将其压入栈顶

invokespecial:调用方法,例子中的方法是类的构造器

现在我们结合指令和操作数栈,来模拟一次计算

c1f163677f13f9eb4a0f1396c32fa8f8.png

回到最开始的问题,a="123"和a=new String("123")的区别,前者指向的是常量池的地址,后者指向的是堆中新开辟的地址。这两个 == 的结果,自然是不相等的。equals的结果呢?equals是字符逐个比较内容,是相等的。

本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的Java教程视频栏目!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值