资讯专栏INFORMATION COLUMN

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

doodlewind / 2700人阅读

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

概要

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 = new String("abc") console.log("s1 == s2", s1 == s2) //true console.log("s1 === s2", s1 === s2) // true console.log("s1 == s3", s1 == s3) //t...

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

    ...结 今天,我们用一个例子,通过画图以及代码实现两个角度剖析了 instanceof 实现原理,其实思路也很简单,无非就是一个沿原型链向上查找过程。希望大家可以在以后面试过程中,不再被" instanceof 实现原理是什么?"这...

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

    ...带来一定帮助。正则表达式实现重叠匹配import regex string = '100101010001' str_re = '101' print(regex.findall(str_re, string, overlapped=True))普通re库匹配,只能匹配一个’101’。正则表达式与正则匹配正...

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

    ...系统,我们称之为“核心(kernel)”。然而,使用者角度来说,使用者也没办法直接操作kernel,而是透过kernel“外壳”程序,也就是所谓shell,来与kernel沟通。这也正是kernel跟shell形像命名关系。 技术角度来说,shel...

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

    ...系统,我们称之为“核心(kernel)”。然而,使用者角度来说,使用者也没办法直接操作kernel,而是透过kernel“外壳”程序,也就是所谓shell,来与kernel沟通。这也正是kernel跟shell形像命名关系。 技术角度来说,shel...

    ShevaKuilin 评论0 收藏0

发表评论

0条评论

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