String+String的javac原理和javap

本文详细介绍了javap工具的功能及其使用方法,包括如何查看Java编译器生成的字节码,理解代码的内部实现过程,并通过实例展示了如何使用javap命令解析字节码文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

javap是jdk自带的一个工具,可以反编译,也可以查看java编译器生成的字节码,是分析代码的一个好工具。

-help 帮助
-l 输出行和 变量的表
-public 只输出public方法和域
-protected 只输出public和protected类和成员
-package 只输出包,public和protected类和成员,这是默认的
-p -private 输出所有类和成员
-s 输出内部类型签名
-c 输出分解后的代码,例如,类中每一个方法内,包含java 字节码的指令,
-verbose 输出栈大小,方法参数的个数
-constants 输出静态final常量


Java代码  
  1. package test;  
  2.   
  3. public class Test {  
  4.   
  5.     public static void main(String[] args) {  
  6.   
  7.         String s1 = new String("小菜鸟");  
  8.         String s2 = new String("大菜鸟");  
  9.           
  10.         String resultString = s1 + s2 + "老鸟";  
  11.     }  
  12.   
  13. }  


以上代码编译成class文件后 
用javap Test -verbose 命令看下字节码文件中的内容: 
注意下面代码第100行,重点所在  
Java代码   收藏代码
  1. D:\Workspace\MyEclipse\workspace\Test\bin\test>javap Test -verbose  
  2. Compiled from "Test.java"  
  3. public class test.Test extends java.lang.Object  
  4.   SourceFile: "Test.java"  
  5.   minor version: 0  
  6.   major version: 50  
  7.   Constant pool:  
  8. const #1 = class        #2;     //  test/Test  
  9. const #2 = Asciz        test/Test;  
  10. const #3 = class        #4;     //  java/lang/Object  
  11. const #4 = Asciz        java/lang/Object;  
  12. const #5 = Asciz        <init>;  
  13. const #6 = Asciz        ()V;  
  14. const #7 = Asciz        Code;  
  15. const #8 = Method       #3.#9;  //  java/lang/Object."<init>":()V  
  16. const #9 = NameAndType  #5:#6;//  "<init>":()V  
  17. const #10 = Asciz       LineNumberTable;  
  18. const #11 = Asciz       LocalVariableTable;  
  19. const #12 = Asciz       this;  
  20. const #13 = Asciz       Ltest/Test;;  
  21. const #14 = Asciz       main;  
  22. const #15 = Asciz       ([Ljava/lang/String;)V;  
  23. const #16 = class       #17;    //  java/lang/String  
  24. const #17 = Asciz       java/lang/String;  
  25. const #18 = String      #19;    //  小菜鸟  
  26. const #19 = Asciz       小菜鸟;  
  27. const #20 = Method      #16.#21;        //  java/lang/String."<init>":(Ljava/lan  
  28. g/String;)V  
  29. const #21 = NameAndType #5:#22;//  "<init>":(Ljava/lang/String;)V  
  30. const #22 = Asciz       (Ljava/lang/String;)V;  
  31. const #23 = String      #24;    //  大菜鸟  
  32. const #24 = Asciz       大菜鸟;  
  33. const #25 = class       #26;    //  java/lang/StringBuilder  
  34. const #26 = Asciz       java/lang/StringBuilder;  
  35. const #27 = Method      #16.#28;        //  java/lang/String.valueOf:(Ljava/lang  
  36. /Object;)Ljava/lang/String;  
  37. const #28 = NameAndType #29:#30;//  valueOf:(Ljava/lang/Object;)Ljava/lang/Strin  
  38. g;  
  39. const #29 = Asciz       valueOf;  
  40. const #30 = Asciz       (Ljava/lang/Object;)Ljava/lang/String;;  
  41. const #31 = Method      #25.#21;        //  java/lang/StringBuilder."<init>":(Lj  
  42. ava/lang/String;)V  
  43. const #32 = Method      #25.#33;        //  java/lang/StringBuilder.append:(Ljav  
  44. a/lang/String;)Ljava/lang/StringBuilder;  
  45. const #33 = NameAndType #34:#35;//  append:(Ljava/lang/String;)Ljava/lang/String  
  46. Builder;  
  47. const #34 = Asciz       append;  
  48. const #35 = Asciz       (Ljava/lang/String;)Ljava/lang/StringBuilder;;  
  49. const #36 = String      #37;    //  老鸟  
  50. const #37 = Asciz       老鸟;  
  51. const #38 = Method      #25.#39;        //  java/lang/StringBuilder.toString:()L  
  52. java/lang/String;  
  53. const #39 = NameAndType #40:#41;//  toString:()Ljava/lang/String;  
  54. const #40 = Asciz       toString;  
  55. const #41 = Asciz       ()Ljava/lang/String;;  
  56. const #42 = Asciz       args;  
  57. const #43 = Asciz       [Ljava/lang/String;;  
  58. const #44 = Asciz       s1;  
  59. const #45 = Asciz       Ljava/lang/String;;  
  60. const #46 = Asciz       s2;  
  61. const #47 = Asciz       resultString;  
  62. const #48 = Asciz       SourceFile;  
  63. const #49 = Asciz       Test.java;  
  64.   
  65. {  
  66. public test.Test();  
  67.   Code:  
  68.    Stack=1, Locals=1, Args_size=1  
  69.    0:   aload_0  
  70.    1:   invokespecial   #8//Method java/lang/Object."<init>":()V  
  71.    4:   return  
  72.   LineNumberTable:  
  73.    line 30  
  74.   
  75.   LocalVariableTable:  
  76.    Start  Length  Slot  Name   Signature  
  77.    0      5      0    this       Ltest/Test;  
  78.   
  79.   
  80. public static void main(java.lang.String[]);  
  81.   Code:  
  82.    Stack=3, Locals=4, Args_size=1  
  83.    0:   new     #16//class java/lang/String |我加上的:创建一个新对象,对象类型存储在常量池#16  
  84.    3:   dup             //我加上的:复制栈顶部一个字长的内容  
  85.    4:   ldc     #18//String 小菜鸟 |我加上的:把常量池中索引为#18的值压入栈  
  86.    6:   invokespecial   #20//Method java/lang/String."<init>":(Ljava/lang/String;)V |我加上的:调用初始化方法  
  87.    9:   astore_1        //我加上的:将引用类型存入局部变量1  
  88.    10:  new     #16//class java/lang/String |我加上的:10-19同上实例化另一个String对象(大菜鸟)  
  89.    13:  dup  
  90.    14:  ldc     #23//String 大菜鸟  
  91.    16:  invokespecial   #20//Method java/lang/String."<init>":(Ljava/lang/String;)V  
  92.    19:  astore_2  
  93.    20:  new     #25//class java/lang/StringBuilder |我加上的:创建一个StringBuilder对象  
  94.    23:  dup  
  95.    24:  aload_1         //我加上的:从局部变量1中装载引用类型  
  96.    25:  invokestatic    #27//Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;  
  97.    28:  invokespecial   #31//Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V  
  98.    31:  aload_2         //我加上的:从局部变量2中装载引用类型  
  99.    //哈哈,看到这里了吧,javac(我的jdk版本是1.6)编译后的字节码对于String+String+...的处理也是使用StringBuilder的append的  
  100.    32:  invokevirtual   #32//Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;  
  101.    35:  ldc     #36//String 老鸟  
  102.    //同理,连接字符串“老鸟”  
  103.    37:  invokevirtual   #32//Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;  
  104.    40:  invokevirtual   #38//Method java/lang/StringBuilder.toString:()Ljava/lang/String;  
  105.    43:  astore_3  
  106.    44:  return  
  107.   LineNumberTable:  
  108.    line 70  
  109.    line 810  
  110.    line 1020  
  111.    line 1144  
  112.   
  113.   LocalVariableTable:  
  114.    Start  Length  Slot  Name   Signature  
  115.    0      45      0    args       [Ljava/lang/String;  
  116.    10      35      1    s1       Ljava/lang/String;  
  117.    20      25      2    s2       Ljava/lang/String;  
  118.    44      1      3    resultString       Ljava/lang/String;  
  119.   
  120.   
  121. }  
  122.   

<think>首先,用户的问题是关于JVM原理的面试题。我需要根据系统级指令用户可见层的要求来构建我的回答。系统级指令:-所有行内数学表达式必须使用$...$格式。-独立公式必须使用$$...$$格式并单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-回答中引用的段落末尾自然地添加引用标识,例如[^1]。用户可见层:-回答结构清晰,帮助用户逐步解决问题。-尽量保证回答真实可靠。-参考站内引用:引用[1]到[5]是关于JVM的。用户的问题:"我想查找关于JVM原理的面试题请问JVM原理面试题"我需要提供JVM原理相关的面试题。参考引用:-引用[1]提到"JVM面试题总结(87道题含答案解析)"。-引用[2]解释了JVM是什么。-引用[3]提到了JMM(Java内存模型)。-引用[4]讨论了字符串常量池堆。-引用[5]提到JDK工具如javac。我的回答应该基于这些引用,提供一些常见的JVM原理面试题。由于引用[1]说有87道题,我可以列出一些关键的问题。结构:1.**介绍JVM原理**:简要解释JVM是什么,基于引用[2]。2.**列出常见面试题**:提供几个典型的JVM原理面试题。确保问题真实可靠。3.**生成相关问题**:在末尾添加相关问题,如系统指令要求。4.**引用标识**:在回答中引用相关段落时添加引用标识。确保回答清晰、结构化:-使用标题或分段。-用中文。-数学表达式:如果有数学内容,用LaTeX。但JVM主题可能没有太多数学,所以可能不需要。如果有涉及,比如垃圾回收算法,可能需要公式,但保持简单。生成相关问题:-系统指令要求在回答末尾添加相关问题。像示例那样,用"§§相关问题§§"分隔。基于引用,列出一些面试题:-从引用[2]:JVM的定义、组成部分(字节码指令集、寄存器、栈、堆、方法域)。-引用[3]:JMM(JavaMemoryModel)的作用。-引用[4]:字符串常量池堆的关系。-引用[5]:JDK工具如javac的作用。-其他常见问题:类加载机制、垃圾回收、JIT编译器等。可能的面试题列表:1.什么是JVM?它的主要组成部分是什么?[^2]2.JVM如何实现平台无关性?[^2]3.解释Java内存模型(JMM)的作用。[^3]4.描述字符串常量池的工作原理。[^4]5.垃圾回收机制在JVM中是如何工作的?[^3]6.JVM中有哪些垃圾回收器?[^3]7.什么是类加载机制?[^2]8.JIT编译器的作用是什么?[^2]在回答中,我可以简要解释每个问题或提供答案线索,但要专注于列出问题,因为用户要求的是面试题。用户说:"我想查找关于JVM原理的面试题",所以我应该提供问题列表,而不是完整答案。在生成相关问题部分,添加用户可能问的后续问题。完整回答结构:-开头:介绍,基于引用。-主体:列出JVM原理面试题。-结尾:添加相关问题。确保引用标识:例如,在解释时添加[^2]等。最终输出:-用中文。-结束时添加"§§相关问题§§"相关问题列表。</think>### JVM原理面试题总结 基于您的查询,我整理了JVM(Java虚拟机)原理相关的常见面试题。这些题目覆盖了JVM的核心概念,包括内存管理、类加载、垃圾回收等,参考了站内权威资料(如JVM面试题总结原理解析[^1][^2][^3])。面试题旨在测试对JVM底层机制的理解,适用于Java开发岗位的面试准备。以下是精选的典型问题(部分问题附带简要说明或关键点,帮助您快速复习): #### 常见JVM原理面试题 1. **什么是JVM?它的主要组成部分有哪些?** - 关键点:JVM是一个虚构的计算机规范,通过仿真实现平台无关性。核心组件包括字节码指令集、寄存器、栈、堆、垃圾回收堆方法域[^2]。 - 衍生问题:JVM如何屏蔽操作系统差异? 2. **JVM如何实现平台无关性?解释字节码执行过程。** - 关键点:Java源代码编译为字节码(.class文件),JVM解释或编译(JIT)字节码为具体平台的机器指令。字节码是中间表示,确保“一次编写,到处运行”[^2]。 3. **描述Java内存模型(JMM)的作用及其与JVM的关系。** - 关键点:JMM定义了线程间内存访问规则,管理JVM到物理内存的映射。它确保可见性、原子性有序性,避免并发问题(如内存屏障happens-before原则)[^3]。 4. **解释字符串常量池的工作原理。为什么 `String s = new String("abc")` 会创建两个对象?** - 关键点:字符串常量池在方法区,“abc”在编译期放入常量池;`new String("abc")` 在运行期在堆上创建新对象,栈引用指向堆对象[^4]。 5. **垃圾回收机制在JVM中是如何工作的?描述常见垃圾回收算法。** - 关键点:垃圾回收器(如Serial、Parallel、CMS、G1)自动管理堆内存,通过标记-清除、复制、标记-整理等算法回收无用对象。涉及Stop-The-World现象分代收集(Young/Old代)[^3]。 6. **JVM中有哪些类加载机制?解释双亲委派模型及其优缺点。** - 关键点:类加载包括加载、链接、初始化阶段。双亲委派模型由Bootstrap、Extension、Application类加载器组成,优先委派父类加载,避免类重复加载安全问题[^2]。 7. **什么是JIT编译器?它如何提升性能?** - 关键点:JIT(Just-In-Time)编译器在运行时将热点字节码编译为本地机器码,减少解释开销。性能提升通过缓存优化动态编译实现[^2]。 8. **JDK工具如 `javac` `javap` 在JVM中的作用是什么?** - 关键点:`javac` 将Java源码编译为字节码;`javap` 反编译字节码,用于调试分析类结构[^5]。 这些面试题源于实际面试总结[^1],建议结合源码JVM文档深入练习。如果您需要某个问题的详细答案或代码示例,请随时说明!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值