1.通过javap命令查看class文件的字节码内容
1.1 编写一个简单的Test类:
public static void main(String[] args) {
int a = 2;
int b = 5;
int c = b ‐ a;
System.out.println(c);
}
1.2 运行该类后target目录下会生成一个class文件
1.3 进入target目录启动cmd命令窗口
1.4 通过javap命令查看该 class文件中的字节码内容
1.5 查看生成的javapTest.txt文件的内容如下
内容大致分为4个部分:
第一部分:显示了生成这个class的java源文件、版本信息、生成时间等。
第二部分:显示了该类中所涉及到常量池,共35个常量。
第三部分:显示该类的构造器,编译器自动插入的。
第四部分:显示了main方的信息。(这个是需要我们重点关注的)
2.常量池
2.1 方法描述符
示例 :
The method descriptor for the method:
Object m(int i, double d, Thread t) {...}
is
(IDLjava/lang/Thread;)Ljava/lang/Object;
2.2 解读方法 字节码
2.3 图解
2.5 研究 i++与++i的不同
2.5.1 编写代码
public static void main(String[] args) { new Test01().method1(); new Test01().method2(); } public void method1(){ int i=1; int a=i++; System.out.println(a); } public void method2(){ int i=1; int a=++i; System.out.println(a); }
2.5.2 运行该类后target中会生成class类 并找到这个class的目录
2.5.3 从上图目录中输入cmd打开命令行窗口 并输入命令
2.5.4 查看Test01.txt内容
2.5.6 对比
i++:
++i:
区别:
i++
只是在本地变量中对数字做了相加,并没有将数据压入到操作栈
将前面拿到的数字1,再次从操作栈中拿到,压入到本地变量中
++i
将本地变量中的数字做了相加,并且将数据压入到操作栈
将操作栈中的数据,再次压入到本地变量中
3. 字符串拼接
字符串的拼接在开发过程中使用是非常频繁的,常用的方式有三种:
+号拼接: str+"456"
StringBuilder拼接
StringBuffer拼接
StringBuffer是保证线程安全的,效率是比较低的,我们更多的是使用场景是不会涉及到
线程安全的问题的,所以更多的时候会选择StringBuilder,效率会高一些
那么,问题来了,StringBuilder和“+”号拼接,哪个效率高呢?接下来我们通过字节码的方式进行探究
3.1 编写测试代码
public static void main(String[] args) { new Test02().m1(); new Test02().m2(); } public void m1(){ String s1 = "123"; String s2 = "456"; String s3 = s1 + s2; System.out.println(s3); } public void m2(){ String s1 = "123"; String s2 = "456"; StringBuilder sb = new StringBuilder(); sb.append(s1); sb.append(s2); String s3 = sb.toString(); System.out.println(s3); }
3.2 运行该类后target下 生成class文件 后通过命令生成字节码文件(这些步骤略详情见上面操作)
从解字节码中可以看出,m1()方法源码中是使用+号拼接,但是在字节码中也被编译成了StringBuilder方式。
所以,可以得出结论,字符串拼接,+号和StringBuilder是相等的,效率一样。