`

Java核心代码(三)javap跟踪String类"+"加号验证

 
阅读更多

 

 

用javap -c Test 在JDK5.0下,做实验。

 

实验一 

  String str = "a" + "b";

  // 将字符串 ab 压入常数池

  0:  ldc    #2; //String ab 

  编译器在编译时产生的字节码已经将 "a" + "b" 优化成了 "ab", 

  “字符串常量相加”的相加也会被优化处理。

 

实验二

  String str = "a" + (1 + 2);

  // 将字符串 a3 压入常数池

  0:  ldc    #2; //String a3 

  虚拟机对其进行同样的优化。

 

  常量间的相加并不会引起效率问题

试验三

  String s = "b";

  String str = "a" + s;

 

  // 将字符串 b 压入常数池 

  0:  ldc    #2; //String b 

  // 将引用存放到 1 号局部变量中 

  2:  astore_1

  // 检查到非常量的相加,这时创建 StringBuilder 对象 

  3:  new    #3; //class java/lang/StringBuilder 

  // 从栈中复制出数据,即把字符串 b 复制出来 

  6:  dup 

  // 调用 StringBuilder 的初始构造 

  7:  invokespecial  #4; //Method java/lang/StringBuilder." <init>":()V 

  // 将字符串 a 压入常数池 

  10:  ldc    #5; //String a 

  // 调用 StringBuilder 的 append 方法,把字符串 a 添加进去 (第一次append)

  12:  invokevirtual  #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 

  // 从 1 号局部变量中加载数据引用 

  15:  aload_1 

  // 调用 StringBuilder 的 append 方法,把字符串 b 添加进去  (第二次append)

  16:  invokevirtual  #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 

  // 调用 StringBuilder 的 toString 方法 

  19:  invokevirtual  #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 

  // 将 toString 的结果保存至 2 号局部变量 

  22:  astore_2 

  23:  return 

 

  变量中存放的是字符串的地址引用, 因为在编译时无法确定它具体的值,无法对其进行优化处理,

  这时为了达到连接的效果,其内部采用了 StringBuilder 的机制进行处理

 

  String str = "a" + s;等同于

  String str = new StringBuilder().append("a").append(s).toString(); 

 

  String str = "a" + s + "b";等同于

  String str = new StringBuilder().append("a").append(s).append("b").toString(); 

 

  string“+”降低效率是这种情况,for循环中会降低效率,@@@@@@@@@@@@@

        return a + "hhhh-" + "aaaa- " + "bbbb-" + "cccc-";和

        return a.append("hhhh-").append("aaaaa-").append("bbbbb-").append("ccccc-").toString();

        效率上基本上没区别。

  不相信权威教条传说。相信JVM。

    String s1="abc";

    for(int i=0;i<3;i++){s1=s1+"def";}

    0:   ldc     #2; //String abc

    7:   if_icmpge       36

    10:  new     #3; //class java/lang/StringBuilder

 

    StringBuilder s1=new StringBuilder("abc");

    for(int i=0;i<3;i++){s1=s1.append("def");}

    0:   new     #2; //class java/lang/StringBuilder

    4:   ldc     #3; //String abc

    6:   invokespecial   #4; //Method java/lang/StringBuilder."<init>":(Ljava/lan

    14:  if_icmpge       30

 

JVM常见指令 

Code:

 0:   iconst_0                //和for循环有关

 1:   istore_2

 2:   iload_2

 3:   iconst_3

 4:   if_icmpge       19        //和for循环有关,到第19行结束

 7:   aload_0

 8:   aload_1

 9:   invokevirtual   #14; //Method java/lang/StringBtring;)Ljava/lang/StringBuilder;

 12:  pop

 13:  iinc    2, 1               //和for循环有关,计数器?第2,1行?

 16:  goto    2                  //和for循环有关,跳转到第2行?

 19:  aload_0

 20:  invokevirtual   #15; //Method java/lang/StringBg/String;

 23:  areturn

0
0
分享到:
评论

相关推荐

    区分java中String+String和String+char

    `javap`是Java字节码反汇编器,它可以显示Java类文件的内部结构,包括常量池、方法代码等。 在给出的例子中,创建一个名为`StringOne`的类,并在主方法中使用`"abc" + '/'`和`"abc" + "/"`,然后通过`javap -v -l ...

    Java运行原理 javap命令运行结果

    3. **加载与链接**:JVM通过类加载器(Class Loader)加载字节码文件,并进行验证、准备和解析三个步骤,确保字节码的安全性和正确性。 4. **执行**:JVM的解释器执行经过验证的字节码,或者通过即时编译器(JIT ...

    使用类分解器Javap分析Java字节码

    `Javap`是Java开发工具包(JDK)中自带的一个命令行工具,专门用于分析Java字节码,帮助开发者理解类文件的内部结构。在这个话题中,我们将深入探讨如何使用`Javap`作为类分解器来解析和理解Java字节码。 首先,让...

    windows命令行中java和javac、javap使用详解(java编译命令)

    总结来说,要利用Windows命令行正确地编译、运行和反编译Java类文件,需要了解命令行的基本操作,正确安装和配置JDK,以及熟悉javac、java和javap这三个命令的具体选项和使用场景。通过这样的过程,我们可以更深入地...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    string和包装类 final关键字特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO...

    学习Java基本语法的仓库 存放学习Java的md文件和Java代码.rar

    JDK的全称(java Development Kit java开发工具包) JDK=JRE+java的开发工具(java,javac,javadoc,javap等) JDK给java开发人员使用包含JRE,所以不用单独安装 JRE JRE(java Runtime environment java运行环境)...

    java中对 i=i++ 的 解释(反编译出java虚拟机指令的)

    在Java编程语言中,`i=i++`是一个典型的自增表达式,它的行为可能会引起一些混淆,特别是当对比于其他编程语言如C或C++时。这个表达式在Java中的行为可以通过反编译成Java虚拟机(JVM)指令来理解。 首先,让我们...

    java代码保护,防止反编译

    经过该工具反汇编后得到的结果并不是源代码,但是使用javap进行反编译的Java类文件可以得到成员变量、方法、行号以及局部变量名等信息。 代码混淆 代码混淆是保护Java程序的一种方法,即将源代码混淆,使其难以被...

    Java类的基本运行顺序

    至于文件`任务安排表.xls`,虽然与Java类的运行顺序直接关系不大,但可以想象在实际项目中,它可能被用来规划和跟踪类的加载和初始化过程,或者记录类之间的依赖关系。例如,通过Excel表格,我们可以列出各个类的...

    javap写的完整记事本

    【标题】"javap写的完整记事本"是一款利用Java编程语言实现的文本编辑器,它具有基础的记事本功能,并且增加了字体...通过阅读和分析源代码,你可以深入理解Java GUI编程、事件处理、文件操作以及文本处理等核心概念。

    Java核心逻辑第2章

    - `java.lang`: 包含了Java运行环境的基本类,如`System`、`String`等。 - `java.util`: 提供了集合框架、日期时间操作等工具类。 - `java.sql`: 支持数据库操作的相关类。 - `java.io`: 提供输入输出流相关的类。 ...

    javap使用(1).docx

    通过 `javap`,开发者能够深入了解 Java 编译器是如何处理源代码并生成字节码的,这对于优化程序性能和理解 Java 虚拟机 (JVM) 的工作原理至关重要。 #### 二、基本概念 在深入了解 `javap` 的使用之前,我们首先...

    Java 代码实现案例

    在这个"Java代码实现案例"中,我们将探讨如何利用Java来模拟数据库表查询,这通常是在开发应用程序时的一个常见需求,特别是在没有实际数据库或者为了快速验证逻辑时。 首先,我们需要理解数据库查询的基本概念。...

    javap使用说明文档

    javap 是 JDK 中的一个命令行工具,主要用于对给定的 class 文件进行反编译,了解 Java 编译器内部的工作机制,并提高程序执行的效率。下面是 javap 的使用说明。 1. javap 的基本用法 javap 的基本用法是 javap ...

    Java源码查看内部类信息.rar

    在Java编程语言中,内部类(也称为嵌套类)是一种强大的特性,它允许我们在一个类的定义内部创建另一个类。这种设计模式可以提供更好的封装,实现更复杂的抽象,并且在某些情况下,如事件处理或匿名类,它可以提高...

    JDK(Java Development Kit)是Java开发工具包的简称,它是Java软件开发环境的核心组件 JDK包含了J

    jdkJDK(Java Development Kit)是Java开发工具包的简称,它是Java软件开发环境的核心组件。JDK包含了Java的运行环境(JRE, Java Runtime Environment)以及Java工具和库的开发工具。使用JDK,开发者可以编写、编译...

    JAVA字节码JAVA字节码.doc

    javap 可以将类文件(.class)中的字节码反编译成 Java 源代码的形式,打印出类中的公共域、方法、构造函数和静态初始值。 javap 的用法语法为:javap &lt;选项&gt; &lt;类名&gt;,其中选项包括: * -b:向后兼容 JDK 1.1 中的...

    《Java语言程序设计基础教程》习题解答

    《Java语言程序设计基础教程》习题解答涵盖了Java编程的基础概念和关键知识点,通过解析书中的练习思考题,我们可以深入理解Java语言的核心要素。以下是基于给定内容的关键知识点总结: ### 1. Java运行平台 Java...

    Java语言实现远程控制jar+源代码

    - `Test`:测试类,用于验证客户端和服务器端的功能。 5. **运行jar包**:提供的jar包可能是一个已经编译好的可执行程序,用户可以直接运行,无需编译源代码。通过命令行参数或者配置文件指定服务器地址和端口,...

Global site tag (gtag.js) - Google Analytics