资讯专栏INFORMATION COLUMN

从指令的角度看"abc"和new String("abc")

doodlewind / 2919人阅读

摘要:但是有一个的指令,可以把字节码翻译成人类能看懂的东西。是文件分解器,可以反编译即对编译的文件进行反编译,也可以查看编译器生成的字节码。现在有一个类,定义入下先用编译成字节码,再使用进行反编译。

概要

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:调用方法,例子中的方法是类的构造器

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73834.html

相关文章

  • 关于""创建字符串new String创建字符串

    摘要:当使用时,基本字符串和字符串对象也会产生不同结果,会将基本字符串作为源代码处理,而字符串对象则被看作对象处理,返回对象。利用方法,我们可以将字符串对象转换为其对应的基本字符串。 笔试的时候总会遇到string 和 new String相关的问题,汇总一下 var s1 = abc var s2 = String(abc) var s3 = new String(abc) var s4 ...

    GT 评论0 收藏0
  • "instanceof 原理是什么"?大声告诉面试官,我知道!

    摘要:一是如何工作的在上是这样描述的运算符用于测试构造函数的属性是否出现在对象原型链中的任何位置换句话说,如果,那么必须是一个对象,而必须是一个合法的函数。下面我们举一个例子一步步来说明第一步每一个构造函数都有一个属性。 在 JavaScript 中,我们通常用 typeof 判断类型,但是在判断引用类型的值时,常常会遇到一个问题:无论引用的是什么类型的对象,都会返回 object(当然还有...

    CompileYouth 评论0 收藏0
  • Python中正则表达式如何实现重叠匹配

      本文主要是给大家介绍的是,Python中正则表达式如何实现重叠匹配的具体操作方法,给大家贴出了具体实例代码,希望能给各位读者带来一定的帮助。正则表达式实现重叠匹配importregex string='100101010001' str_re='101' print(regex.findall(str_re,string,overlapped=True))普通的...

    89542767 评论0 收藏0
  • 【转】shell十三问,为linux学习打基础(上)

    摘要:事实上,在日后的操作及设计上,命令是最常被使用的命令之一。重导向,或将命令置于背境执行。在前一个命令结束时,而忽略其返回值,继续执行下一个命令。空白键已被关掉,仅作为空白键处理。 本文整理并转自CU上的帖子[学习共享] shell 十三問?,此贴是2003年发表的,但却是相当不错的linux基础知识汇集贴,原帖主使用的台湾风格,本文加以简体化和整理。 第1问:为何叫做shell? 在介...

    glumes 评论0 收藏0
  • 【转】shell十三问,为linux学习打基础(上)

    摘要:事实上,在日后的操作及设计上,命令是最常被使用的命令之一。重导向,或将命令置于背境执行。在前一个命令结束时,而忽略其返回值,继续执行下一个命令。空白键已被关掉,仅作为空白键处理。 本文整理并转自CU上的帖子[学习共享] shell 十三問?,此贴是2003年发表的,但却是相当不错的linux基础知识汇集贴,原帖主使用的台湾风格,本文加以简体化和整理。 第1问:为何叫做shell? 在介...

    ShevaKuilin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<