资讯专栏INFORMATION COLUMN

使用javap分析Java的字符串操作

asce1885 / 600人阅读

摘要:使用命令行将包含了这行代码的类反编译查看其字节码我们看到字符串被编译器加到了常量池里。代码被翻译成了下面两句字节码首先底层的原生方法被调用,生成的内部存储实现。做一个字符串拼接的操作。

我们看这样一行简单的字符串赋值操作的Java代码。

String a = "i042416";

使用命令行将包含了这行代码的Java类反编译查看其字节码:

javap -v constant.ConstantFolding

我们看到字符串 "i042416" 被Java编译器加到了常量池里。

Java代码 String a = "i042416"被翻译成了下面两句字节码:

ldc #16: 首先JVM底层的原生方法StringTable::intern被调用,生成String的内部存储实现char[]。然后执行ldc #16, 将常量池内的代号为#16的常量加载到栈上,即i042416。

2. astore_1:将"i042416"的引用存储到序号为1的本地变量中(即我们代码中的局部变量a)。

下面再看一个稍微复杂一点的例子。

做一个字符串拼接的操作。

String aa1 = "i042416";

String aa2 = "jerrywang";

String aa3 = "i042416" + "jerrywang";

可以看到,在编译阶段,编译器字节把两个字符串常量的值进行拼接,结果"i042416jerrywang"存储到变量aa3中, 作为一个新的字符串常量, 在常量池中代号为#21。

因此,变量aa1和aa3实际上指向常量池中的同一个常量,因此直接用==比较也返回true。

String aa1 = "i042416jerrywang";

String aa2 = "jerrywang";

String aa3 = "i042416" + "jerrywang";

System.out.println(aa1 == aa3);

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

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

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

相关文章

  • 使用javap深入理解Java整型常量和整型变量区别

    摘要:我下图代码第五行和第九行分别定义了一个整型变量和一个整型常量程序员都知道两者的区别。下面我们就用将文件反编译出来然后深入研究里整型变量和整型常量的区别。 我下图代码第五行和第九行分别定义了一个整型变量和一个整型常量: static final int number1 = 512; static int number3 = 545; Java程序员都知道两者的区别。 showImg(ht...

    Mr_houzi 评论0 收藏0
  • javap命令与Java Dcompiler工具、IDEA自带反编译器反编译结果差别及原因

    摘要:反汇编器与反编译器不同,反编译器的目标是高级语言而非汇编语言。反汇编器的反汇编输出通常格式化为适合人类阅读,而非用作汇编器的输入源,因此它主要是一个逆向工程工具。本文章参考了通过命令分析汇编指令反汇编器 问题描述 写这篇文章是为了记录我这几天遇到的一个疑惑,并且顺藤摸瓜的学习一下javap命令。遇到的疑惑是这样的:我在看使用枚举类型实现单列模式的博客时,发现一些博客中写到的枚举类型的反...

    张宪坤 评论0 收藏0
  • 一个简单例子教会您使用javap

    摘要:从字节码的分析可以观察到一个有趣的现象,再次看看我们的语句。这张表里每行的后面的数字代表源代码的序号,冒号后面的数字代表字节码里每行指令的序号。维护了源代码同字节指令的映射关系,确保了代码调试的顺利进行。 javap是JDK自带的工具: showImg(https://segmentfault.com/img/remote/1460000016730237); 这篇文章使用下面这段简单...

    BLUE 评论0 收藏0
  • 从指令角度看"abc"和new String("abc")

    摘要:但是有一个的指令,可以把字节码翻译成人类能看懂的东西。是文件分解器,可以反编译即对编译的文件进行反编译,也可以查看编译器生成的字节码。现在有一个类,定义入下先用编译成字节码,再使用进行反编译。 概要 Java工程师面试官偏爱的问题之一,就是abc和 new String(abc)的区别是什么?回答的比较好的会带出Java堆,栈,常量池,引用等概念。但今天不止如此,我们从指令的角度,去看...

    doodlewind 评论0 收藏0
  • 为何Spring MVC可获取到方法参数名,而MyBatis却不行?【享学Spring MVC】

    每篇一句 胡适:多谈些问题,少聊些主义 前言 Spring MVC和MyBatis作为当下最为流行的两个框架,大家平时开发中都在用。如果你往深了一步去思考,你应该会有这样的疑问: 在使用Spring MVC的时候,你即使不使用注解,只要参数名和请求参数的key对应上了,就能自动完成数值的封装 在使用MyBatis(接口模式)时,接口方法向xml里的SQL语句传参时,必须(当然不是100%的必须,...

    孙淑建 评论0 收藏0

发表评论

0条评论

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