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 是相等的, 效率一样.
来源: http://www.bubuko.com/infodetail-3456869.html