用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
相关推荐
`javap`是Java字节码反汇编器,它可以显示Java类文件的内部结构,包括常量池、方法代码等。 在给出的例子中,创建一个名为`StringOne`的类,并在主方法中使用`"abc" + '/'`和`"abc" + "/"`,然后通过`javap -v -l ...
3. **加载与链接**:JVM通过类加载器(Class Loader)加载字节码文件,并进行验证、准备和解析三个步骤,确保字节码的安全性和正确性。 4. **执行**:JVM的解释器执行经过验证的字节码,或者通过即时编译器(JIT ...
`Javap`是Java开发工具包(JDK)中自带的一个命令行工具,专门用于分析Java字节码,帮助开发者理解类文件的内部结构。在这个话题中,我们将深入探讨如何使用`Javap`作为类分解器来解析和理解Java字节码。 首先,让...
总结来说,要利用Windows命令行正确地编译、运行和反编译Java类文件,需要了解命令行的基本操作,正确安装和配置JDK,以及熟悉javac、java和javap这三个命令的具体选项和使用场景。通过这样的过程,我们可以更深入地...
string和包装类 final关键字特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO...
JDK的全称(java Development Kit java开发工具包) JDK=JRE+java的开发工具(java,javac,javadoc,javap等) JDK给java开发人员使用包含JRE,所以不用单独安装 JRE JRE(java Runtime environment java运行环境)...
在Java编程语言中,`i=i++`是一个典型的自增表达式,它的行为可能会引起一些混淆,特别是当对比于其他编程语言如C或C++时。这个表达式在Java中的行为可以通过反编译成Java虚拟机(JVM)指令来理解。 首先,让我们...
经过该工具反汇编后得到的结果并不是源代码,但是使用javap进行反编译的Java类文件可以得到成员变量、方法、行号以及局部变量名等信息。 代码混淆 代码混淆是保护Java程序的一种方法,即将源代码混淆,使其难以被...
至于文件`任务安排表.xls`,虽然与Java类的运行顺序直接关系不大,但可以想象在实际项目中,它可能被用来规划和跟踪类的加载和初始化过程,或者记录类之间的依赖关系。例如,通过Excel表格,我们可以列出各个类的...
【标题】"javap写的完整记事本"是一款利用Java编程语言实现的文本编辑器,它具有基础的记事本功能,并且增加了字体...通过阅读和分析源代码,你可以深入理解Java GUI编程、事件处理、文件操作以及文本处理等核心概念。
- `java.lang`: 包含了Java运行环境的基本类,如`System`、`String`等。 - `java.util`: 提供了集合框架、日期时间操作等工具类。 - `java.sql`: 支持数据库操作的相关类。 - `java.io`: 提供输入输出流相关的类。 ...
通过 `javap`,开发者能够深入了解 Java 编译器是如何处理源代码并生成字节码的,这对于优化程序性能和理解 Java 虚拟机 (JVM) 的工作原理至关重要。 #### 二、基本概念 在深入了解 `javap` 的使用之前,我们首先...
在这个"Java代码实现案例"中,我们将探讨如何利用Java来模拟数据库表查询,这通常是在开发应用程序时的一个常见需求,特别是在没有实际数据库或者为了快速验证逻辑时。 首先,我们需要理解数据库查询的基本概念。...
javap 是 JDK 中的一个命令行工具,主要用于对给定的 class 文件进行反编译,了解 Java 编译器内部的工作机制,并提高程序执行的效率。下面是 javap 的使用说明。 1. javap 的基本用法 javap 的基本用法是 javap ...
在Java编程语言中,内部类(也称为嵌套类)是一种强大的特性,它允许我们在一个类的定义内部创建另一个类。这种设计模式可以提供更好的封装,实现更复杂的抽象,并且在某些情况下,如事件处理或匿名类,它可以提高...
jdkJDK(Java Development Kit)是Java开发工具包的简称,它是Java软件开发环境的核心组件。JDK包含了Java的运行环境(JRE, Java Runtime Environment)以及Java工具和库的开发工具。使用JDK,开发者可以编写、编译...
javap 可以将类文件(.class)中的字节码反编译成 Java 源代码的形式,打印出类中的公共域、方法、构造函数和静态初始值。 javap 的用法语法为:javap <选项> <类名>,其中选项包括: * -b:向后兼容 JDK 1.1 中的...
《Java语言程序设计基础教程》习题解答涵盖了Java编程的基础概念和关键知识点,通过解析书中的练习思考题,我们可以深入理解Java语言的核心要素。以下是基于给定内容的关键知识点总结: ### 1. Java运行平台 Java...
- `Test`:测试类,用于验证客户端和服务器端的功能。 5. **运行jar包**:提供的jar包可能是一个已经编译好的可执行程序,用户可以直接运行,无需编译源代码。通过命令行参数或者配置文件指定服务器地址和端口,...