ImageVerifierCode 换一换
格式:DOC , 页数:4 ,大小:39KB ,
资源ID:7004570      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-7004570.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(从.class文件看为什么String进行“+”操作性能不如StringBuilder的append().doc)为本站会员(tkhy51908)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

从.class文件看为什么String进行“+”操作性能不如StringBuilder的append().doc

1、从.class 文件看为什么 String 进行“+” 操作性能不如 StringBuilder 的 append()请看下面这段代码public class StringTest public static void main(String args) String result = “;for(int i=0;i“);System.out.println(“result =“+result);StringBuilder result1 = new StringBuilder();for(int i=0;i“);System.out.println(“result1 =“+result1);

2、那么为什么 String 会很慢呢?我们一直说 String 是不可变的类,因此它慢,其实还有更深层的原因。我们把编译后的 StringTest.class 文件拖到 eclipse 里,发现 / Compiled from StringTest.java (version 1.6 : 50.0, super bit)public class com.cy.test.StringTest / Method descriptor #6 ()V/ Stack: 1, Locals: 1public StringTest();0 aload_0 this1 invokespecial java.la

3、ng.Object() 84 returnLine numbers:pc: 0, line: 3Local variable table:pc: 0, pc: 5 local: this index: 0 type: com.cy.test.StringTest/ Method descriptor #15 (Ljava/lang/String;)V/ Stack: 4, Locals: 4public static void main(java.lang.String args);0 ldc 162 astore_1 result3 iconst_04 istore_2 i5 goto 30

4、8 new java.lang.StringBuilder 1811 dup12 aload_1 result13 invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String 2016 invokespecial java.lang.StringBuilder(java.lang.String) 2619 iload_2 i20 invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder 2923 invokevi

5、rtual java.lang.StringBuilder.toString() : java.lang.String 3326 astore_1 result27 iinc 2 1 i30 iload_2 i31 bipush 1033 if_icmplt 836 getstatic java.lang.System.out : java.io.PrintStream 3739 ldc “ 4341 invokevirtual java.io.PrintStream.println(java.lang.String) : void 4544 getstatic java.lang.Syste

6、m.out : java.io.PrintStream 3747 new java.lang.StringBuilder 1850 dup51 ldc 5053 invokespecial java.lang.StringBuilder(java.lang.String) 2656 aload_1 result57 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder 5260 invokevirtual java.lang.StringBuilder.toString(

7、) : java.lang.String 3363 invokevirtual java.io.PrintStream.println(java.lang.String) : void 4566 new java.lang.StringBuilder 1869 dup70 invokespecial java.lang.StringBuilder() 5573 astore_2 result174 iconst_075 istore_3 i76 goto 8879 aload_2 result180 iload_3 i81 invokevirtual java.lang.StringBuild

8、er.append(int) : java.lang.StringBuilder 2984 pop85 iinc 3 1 i88 iload_3 i89 bipush 1091 if_icmplt 7994 getstatic java.lang.System.out : java.io.PrintStream 3797 ldc “ 4399 invokevirtual java.io.PrintStream.println(java.lang.String) : void 45102 getstatic java.lang.System.out : java.io.PrintStream 3

9、7105 new java.lang.StringBuilder 18108 dup109 ldc 56111 invokespecial java.lang.StringBuilder(java.lang.String) 26114 aload_2 result1115 invokevirtual java.lang.StringBuilder.append(java.lang.Object) : java.lang.StringBuilder 58118 invokevirtual java.lang.StringBuilder.toString() : java.lang.String

10、33121 invokevirtual java.io.PrintStream.println(java.lang.String) : void 45124 returnLine numbers:pc: 0, line: 7pc: 3, line: 8pc: 8, line: 9pc: 27, line: 8pc: 36, line: 12pc: 44, line: 13pc: 66, line: 15pc: 74, line: 16pc: 79, line: 17pc: 85, line: 16pc: 94, line: 20pc: 102, line: 21pc: 124, line: 2

11、4Local variable table:pc: 0, pc: 125 local: args index: 0 type: java.lang.Stringpc: 3, pc: 125 local: result index: 1 type: java.lang.Stringpc: 5, pc: 36 local: i index: 2 type: intpc: 74, pc: 125 local: result1 index: 2 type: java.lang.StringBuilderpc: 76, pc: 94 local: i index: 3 type: intStack ma

12、p table: number of frames 4pc: 8, append: java.lang.String, intpc: 30, samepc: 79, full, stack: , locals: java.lang.String, java.lang.String, java.lang.StringBuilder, intpc: 88, same大家学过汇编,当然我们以前学的是 x8086 的汇编语言,这是 java jvm 的汇编语言(我们不是一直说 java 被编译成 class,jvm 把 class 编译成特定的机器码,这样 class 相当于是jvm 的汇编语言) 。

13、我们虽然不是太懂,但是可以根据英语单词意思以及以往学过的汇编推出红色字体部分是他的循环部分,大概就是先 goto 跳转的判断语句 if_icmplt 8 判断符不符合条件(第 5 行,只得是它标注行数的地方,下面一样)符合就到 8 不符合往下走。iinc 2 1 i所给的 i 自增,这些都忽略。关键是蓝色字体的部分,你发现了区别,String 进行 + 操作产生了一个 StringBuilder 对象,这个对象进行 append() 。最后使用 toString()方法然后保存。并且这个对象实在循环内部,看上面的蓝色字体部位。这样你可以想象,屌丝们,循环十次会产生是个 StringBuilder 对象。调用十次 toString()方法。产生对象是非常耗性能的,亲。而使用 StringBuilder 时我们发现只产生了一个 StringBuilder 对象,他在循环体外产生。因此,他的开销小的多。所以大家现在明白了为什么 String 进行循环的字符串 + 操作会那么慢了吧?如果不是进行循环时间差不多的,因为只产生了一个 StringBuilder 而已,两个应该差不多。个人理解,不喜勿喷,欢迎那个纠错。

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报