`
曾经de迷茫
  • 浏览: 14994 次
  • 性别: 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下我自己写程序试验了一下,结果跟上面不太一致,看不出优化后性能提高的痕迹。并且在问答区发了个问题,现在还没满意的解答,可否看一下。

相关推荐

    JDK资源包合集(JDK6+JDK7+JDK8)

    JDK7,即Java SE 7(标准版7),2011年推出,引入了显著的语法改进,例如try-with-resources语句,用于自动关闭资源,增强了switch语句,允许使用字符串作为case标签,以及对多路复用文件I/O的支持。此外,JDK7还...

    jdk11官网下载 linux+windows

    3. **文本块**:新增的文本块语法简化了多行字符串的编写。 4. **局部变量类型推断**:使用`var`关键字,编译器可以根据初始值自动推断局部变量的类型。 5. **静态导入改进**:可以使用`import static *`导入所有...

    jdk6-8String类

    JDK 1.8继续对`String`类进行改进,特别是在字符串操作的性能和内存使用上。 #### 新特性与优化 - ** equals() 和 intern() 的优化**:1.8对`equals()`和`intern()`进行了优化,提高了比较和查找效率。现在`equals...

    关于JDK8中的字符串拼接示例详解

    总结来说,JDK 8对字符串拼接进行了优化,当字符串拼接在编译时可确定时,编译器会自动转换为使用`StringBuilder`。然而,对于运行时动态拼接的情况,开发者仍需手动使用`StringBuilder`或`StringBuffer`以获得最佳...

    jdk免安装版(1.8+1.7,64位)

    3. **字符串inswitch**:在switch语句中直接使用字符串,增加了灵活性。 4. **钻石操作符**:编译器能够自动推断出泛型实例化时的类型参数,使得代码更简洁。 5. **类型注解**:允许在类型签名的任何位置使用注解...

    guava-jdk5

    5. **字符串处理**:Guava提供了一系列的字符串处理工具,如Joiner、Splitter、CharMatcher等,使字符串操作更加方便和高效。例如,Joiner可以方便地将多个字符串连接成一个,Splitter可以按特定规则分割字符串。 6...

    基于 Java 使用 Spring Boot 3 和 JDK 17.zip

    文本块(Text Blocks)允许更直观地处理多行字符串,减少了转义字符的困扰;还有记录类(Records),这是一种新型的类声明,自动提供了构造函数、equals、hashCode和toString方法,使得数据持有类的编写更加简洁。 ...

    Linux+(jdk1.7+tomcat5)

    总的来说,这个压缩包为在Linux环境下进行Java开发和部署提供了基础环境,使用者可以根据自己的需求对JDK和Tomcat进行进一步的配置和优化。对于初学者,这是一份很好的实践材料;对于经验丰富的开发者,这则提供了一...

    字符串连接方面测试时间

    字符串连接作为字符串操作中最常见的场景之一,其性能优化对于提升应用效率至关重要。本文将深入探讨在Java中使用不同方法进行字符串连接时的性能差异,特别是针对“+”运算符与`StringBuffer`类在大量字符串连接...

    jdk1.7+jdk1.8

    2. **字符串在常量池中的 intern()**:字符串常量池优化,提高了性能。 3. **钻石操作符**:自动类型推断,如`List&lt;String&gt; list = new ArrayList();` 4. **try-with-resources**:自动关闭资源,提高了代码的可读性...

    JDK1.8+API+中文文档+高清完整版+CHM

    字符串类`String`和`StringBuilder`也得到了一些优化,如`String`的`join()`方法和`StringBuilder`的`appendCodePoint()`方法。 综上所述,JDK 1.8 API中文文档涵盖了这些重要的新特性,对于Java开发者来说,深入...

    jdk1.8源码+中文注释(chm格式)

    9. **String的优化**:JDK1.8对字符串进行了优化,例如新增了`String.join()`方法,以及`StringBuilder`和`StringBuffer`的改进,提升了字符串操作的效率。 10. **Optional类**:为了解决Java中的null安全问题,JDK...

    Java JDK 7学习笔记 PDF

    6. **字符串拼接优化**:JDK 7对字符串拼接进行了优化,使用StringBuilder或StringBuffer时,如果拼接的对象是字符串常量,编译器会自动优化为使用`+`操作符,避免了不必要的对象创建。 7. **动态语言支持**:JDK 7...

    jdk+api+1.8.zip

    例如,创建一个不可变的字符串列表: ```java List&lt;String&gt; list = List.of("One", "Two", "Three"); ``` 以上只是JDK1.8 API中部分重要的新特性与知识点,实际使用中还有许多其他改进,如Nashorn JavaScript引擎...

    JDK5_新特性

    自动封箱和解封在JDK5.0中进行了优化,确保类型安全,避免了因隐式类型转换可能导致的错误。 8. **注解(Annotations)**: 注解提供了一种元数据机制,允许在代码中添加信息,用于编译器、构建工具或运行时系统...

    jdk1.7+api+英文版

    3. **字符串开关(Switch Statement for Strings)**: JDK 1.7允许在switch语句中直接使用字符串,增强了语言的表达能力。 4. **动态类型语言支持**: 支持Groovy、Scala等动态类型语言的字节码,通过 invokedynamic...

    jdk1.8+正则表达式模拟器+CRT+soupUI+serverAgent.rar

    2. **正则表达式模拟器**:正则表达式是一种强大的文本处理工具,用于匹配、查找、替换字符串模式。正则表达式模拟器通常是一个图形用户界面的应用程序,允许用户输入正则表达式并实时测试其效果,有助于开发者在...

    java jdk 1.5 API html

    这个版本引入了大量的新特性,优化和改进,极大地提升了Java编程的效率和灵活性。本API HTML文档是开发者学习和查阅Java 1.5 API的重要参考资料,下面将详细介绍其中的一些关键知识点。 1. **泛型(Generics)** ...

    字符数组的存储方式 字符串常量池.docx

    此外,字符串拼接也是常见的操作,Java提供多种方式进行字符串拼接,如`+`运算符、StringBuilder或StringBuffer。使用`+`运算符时,如果涉及字符串常量,JVM会在编译时进行优化,合并常量字符串。但对于运行时的动态...

Global site tag (gtag.js) - Google Analytics