`
JerryWang_SAP
  • 浏览: 1030176 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

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

阅读更多

我们看这样一行简单的字符串赋值操作的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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

 

 
 
0
0
分享到:
评论

相关推荐

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

    3. **常量池**:存储字符串、类引用、方法引用等元数据的地方,是字节码解析的关键。 4. **访问标志**:表明类或接口的访问权限,如是否是公共的、抽象的或最终的等。 5. **类、父类和接口**:类的全名,父类的全名...

    Java 字符串的拼接详解

    下面我们将深入探讨Java字符串拼接的原理、性能影响以及编译器的优化策略。 首先,当我们用`+`运算符或`StringBuilder`/`StringBuffer`进行字符串拼接时,由于String的不可变性,每次拼接都会创建新的字符串对象。...

    Java String 拼接字符串原理详解

    当我们使用 + 号对两个字符串进行拼接时,Java 编译器实际上会将其转换为 StringBuilder 对象的 append 操作。 我们可以通过使用 javap 工具来验证这一点。javap 是 Java 编译器提供的一个工具,可以将编译后的类...

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

    )V**:主方法,是程序的入口点,它接受一个字符串数组作为参数,返回值类型为`void`。 4. **其他属性**: - **Code**:表示方法体的字节码指令。 - **LineNumberTable**:提供了方法中行号与字节码偏移之间的映射...

    javap写的完整记事本

    String是不可变的,而StringBuilder(线程不安全)和StringBuffer(线程安全)则允许动态修改字符串内容,适用于文本编辑操作。 7. **异常处理**:在处理文件操作时,可能会遇到如文件不存在、权限不足等问题,因此...

    JAVA-持续更新.pdf

    6. Java字符串 - 字符串的声明:String 变量名 = "字符串值" - 字符串的方法:length()、charAt()、substring()、indexOf()、trim() - StringBuffer:可变字符串,提供了append()、insert()、delete()、replace()...

    关于JDK8中的字符串拼接示例详解

    当字符串拼接的操作在编译时可以确定时,Java编译器会自动转换为使用`StringBuilder`进行拼接,就像在上述示例中的`result += "some more data";`。通过`javap -c`反编译可以看到,编译器实际上生成了使用`...

    javap-Tool:JAVA项目

    3. **查看常量池**:在类文件中,常量池存储了类的各种元数据,包括字符串、类名、方法名等。`javap`可以展示常量池的内容,帮助开发者了解类是如何引用这些元数据的。 4. **解析类文件版本**:`javap`还可以告诉你...

    计算机JAVA程序和平日练习

    在 Java 中,字符串是不可变的,因此对于频繁的字符串操作,使用 StringBuffer 或 StringBuilder 类更高效。 以上就是针对给定题目中的知识点进行的详细解释,涵盖了 Java 语言的基础特性、类库、工具、字符串操作...

    java开源包8

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    Java工程师面试复习指南

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

    javap写的一个动态日历

    3. **格式化**:`java.time.format.DateTimeFormatter`用于将日期和时间转换为适合打印的字符串格式。 4. **控制台I/O**:`System.out.println()`用于在控制台上打印日历信息。 5. **用户交互**:尽管描述中提到的是...

    java入门使用课件,可自学,可用于教学

    引用类型包括字符串、数组、集合等。 变量的命名 变量名的命名规则是:只能由字母和下划线(_)开头,由字母、数字、下划线(_)和美元符号($)组成,不能是Java关键字和保留字。变量的命名规范是:要有意义,...

    Java2实用教程(第5版)课后习题答案_耿祥义版.docx

    本资源为Java2实用教程第5版课后习题答案耿祥义版,涵盖Java基础知识点,包括Java入门、基本数据类型、数组、标识符、运算符、控制流程、方法、数组和字符串等。 1. Java入门 * Java语言是面向对象编程,编写的...

    JAVA入门自学经典

    环境变量是供系统内部使用的变量,包含系统当前用户环境信息的字符串和软件的确切存放路径。配置环境变量的方法如下所述。 在JDK中,有许多常用的命令,例如javac命令。javac命令用于编译Java程序,它有许多参数...

    eclipse配置javap命令的方法

    例如,当我们想探究JVM对特定语法或优化的实现,如字符串连接操作,`javap`是一个非常有用的工具。在《Thinking in Java》等书籍中,`javap`被推荐用来辅助理解JVM的底层机制。 配置`javap`命令在Eclipse中的步骤...

    轻松看懂Java字节码.pdf

    3. 常量池(Constant Pool):紧随版本信息之后的是常量池,它包含了程序中用到的所有字符串、类、接口、方法等信息,这是字节码文件的核心部分。 4. 反编译字节码:文档提到了使用Java内置工具javap进行字节码反...

    java7解压版

    - **字符串inswitch**:在switch语句中可以直接使用字符串,方便处理枚举值和常量。 - **捕获多个异常**:允许在一个catch子句中捕获多个异常类型。 - **改进的for循环**(增强for循环):现在可以遍历数组和集合...

    java复习习题.pdf

    15. **字符串类**:在Java中,字符串由`java.lang.String`和`java.lang.StringBuffer`(或`StringBuilder`)定义,`String`用于不可变字符串,`StringBuffer`用于可变字符串操作。 16. **所有类的父类**:在Java中...

    java jdk1.7_64位安装包

    - **字符串inswitch**:在switch语句中可以直接使用字符串,增强了代码的可读性。 - **钻石操作符**:在创建匿名内部类或集合时,可以省略泛型参数的类型推断。 - **二进制字面量与下划线分隔符**:支持二进制...

Global site tag (gtag.js) - Google Analytics