`
曾经de迷茫
  • 浏览: 14679 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JDK5对字符串+操作进行的优化

阅读更多
zli.ray 写道
超级潜水艇 写道
第七点已经在JDK6的时候由编译器进行了优化,所以在一般的编写过程中是无需使用StringBuffer或StringBuilder的。编译器会在编译时自动将+的操作转变成StringBuilder的操作。。由我来看使用+操作比使用StringBuilder更加易懂明了(既然编译器已经为你做了优化)。但是有一点要注意。在一个循环中还是得自己写StringBuilder。因为这时编译器是不会给你进行优化的

这个挺好,方便很多。
但没看到官方有说明...

 

这个容易,JDK5编译器就会优化字符串+操作了。不过不要在loop里面使用+(每次loop都会创建一个StringBulider):

 /**
    * @version $Id: StringConcatTest.java Exp $              
   */

public class StringConcatTest {
        //普通字符串相加,JDK5 ↑编译器会自动转为StringBulider处理
        public static String testConcat(String begin){
                return begin+"5"+"2"+"1";
        }
        // 不要循环里相加,每次循环创建一个StringBulider
        public static String testConcatInLoop(String begin){
                for(int i=10;i>0;i--){
                        begin+=""+i;
                }
                return begin;
        }
}

 然后用javap看一下字节码,一目了然:

javap -verbose StringConcatTest > c:\cyy.txt

 下面是文件内容,有点类汇编:

public static java.lang.String testConcat(java.lang.String);
  Code:
   Stack=3, Locals=1, Args_size=1
   0:	new	#16; //class java/lang/StringBuilder
   3:	dup
   4:	aload_0
   5:	invokestatic	#18; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
   8:	invokespecial	#24; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
   11:	ldc	#27; //String 5
   13:	invokevirtual	#29; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   16:	ldc	#33; //String 2
   18:	invokevirtual	#29; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   21:	ldc	#35; //String 1
   23:	invokevirtual	#29; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   26:	invokevirtual	#37; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   29:	areturn
  LineNumberTable: 
   line 18: 0

  LocalVariableTable: 
   Start  Length  Slot  Name   Signature
   0      30      0    begin       Ljava/lang/String;


public static java.lang.String testConcatInLoop(java.lang.String);
  Code:
   Stack=3, Locals=2, Args_size=1
   0:	bipush	10
   2:	istore_1
   3:	goto	28
   6:	new	#16; //class java/lang/StringBuilder
   9:	dup
   10:	aload_0
   11:	invokestatic	#18; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
   14:	invokespecial	#24; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
   17:	iload_1
   18:	invokevirtual	#44; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
   21:	invokevirtual	#37; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   24:	astore_0
   25:	iinc	1, -1
   28:	iload_1
   29:	ifgt	6  //循环内调用 + 操作,又跳至第6行创建了一个StringBulider
   32:	aload_0
   33:	areturn
  LineNumberTable: 
   line 22: 0
   line 23: 6
   line 22: 25
   line 25: 32

  LocalVariableTable: 
   Start  Length  Slot  Name   Signature
   0      34      0    begin       Ljava/lang/String;
   3      29      1    i       I


}
分享到:
评论
1 楼 firefly.li 2010-07-08  
你好,针对上面String优化的说法,在JDK1.6下我自己写程序试验了一下,结果跟上面不太一致,看不出优化后性能提高的痕迹。并且在问答区发了个问题,现在还没满意的解答,可否看一下。

相关推荐

    Java优化编程(第2版)

    4.2.2 字符串的length()方法与性能优化 4.2.3 tochararray()方法与性能优化 4.2.4 字符串转化为数字 4.3 系统i/o类 4.3.1 java语言中输入/输出流 4.3.2 通过系统缓冲流类提高i/o操作效率 4.3.3 通过自定制缓冲区提高...

    正则表达式验证收藏工具 1.5 windows linux双系统支持(java程序员专用,非java程序员勿入) 天涯浪子

    能对输入的字符串进行验证,还能收藏你常用的正则规则。使用环境。jkd6.0 ,linux/windows操作系统 @echo ************************************* @echo ** *** @echo ** 请不要更改jar文件的名字 *** @echo ** ***...

    JDK_1_6 API

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    字符串+正则 流 字符流 字节流 语言特性 继承 封装 多态 JVM 多线程与并发 GC机制 GC收集器类型 串行 CMS 并行 G1 算法 复制 标记清理 标记整理 分区 新生代 eden survivor 老年代(old区...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例073 根据标点符号对字符串进行分行 92 实例074 将字符串的每个字符进行倒序输出 94 实例075 获取字符串中汉字的个数 94 实例076 批量替换某一类字符串 95 实例077 把异常与错误信息显示到窗体中 97 实例078 从...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    10.3用StringBuffer类进行字符串处理 10.4基本数据类型的包装类 10.4.1认识包装类 10.4.2通过包装类进行数据转换 10.5认识Java集合 10.5.1为什么需要集合 10.5.2Java中的集合 10.6使用一维集合 10.6.1认识一...

    [Java参考文档].JDK_API 1.6

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。...

    pro_android_cpp_with_the_ndk.pdf

    3.4.1 字符串操作 3.4.2 数组操作 3.4.3 NIO操作 3.4.4 访问域 3.4.5 调用方法 3.4.6 域和方法描述符 3.5 异常处理 3.5.1 捕获异常 3.5.2 抛出异常 3.6 局部和全局引用 3.6.1 局部引用 3.6.2 全局引用 3.6.3 弱全局...

    Guava 16.0 API (CHM格式)

    Strings: 一个非常非常有用的字符串工具类: 提供 splitting,joining, padding 等操作。  七. Primitives: 扩展 JDK 中未提供的对原生类型(如int、char等)的操作, 包括某些类型的无符号的变量。  八. ...

    day019-io笔记和代码.rar

    * 根据默认字符集将字节数组中从指定下标开始到指定长度结束的数据转换为字符串 * * 2.String(byte[] bytes, int offset, int length, String charsetName) * 根据指定字符集将字节数组...

    Grails 技术精解与Web开发实践【源码+样章】----下载不扣分,回帖加1分,欢迎下载,童叟无欺

    3.1.1 字符串 21 3.1.2 数字 22 3.1.3 Groovy的类 23 3.1.4 运算符 24 3.2 Groovy的控制结构 25 3.3 Groovy的集合 27 3.3.1 列表 27 3.3.2 映射 28 3.3.3 区间 29 3.4 Groovy的闭包 30 3.4.1 闭包的定义 30 ...

    Java面试宝典2010版

    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...

    最新Java面试宝典pdf版

    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...

    Java面试笔试资料大全

    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...

    千方百计笔试题大全

    54、字符串操作:如何实现字符串的反转及替换? 14 55、编码转换:怎样将GB2312 编码的字符串转换为ISO-8859-1 编码的字符串? 14 56、写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔。 14 59、...

    java面试宝典

    54、字符串操作:如何实现字符串的反转及替换? 14 55、编码转换:怎样将GB2312 编码的字符串转换为ISO-8859-1 编码的字符串? 14 56、写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔。 14 59、...

Global site tag (gtag.js) - Google Analytics