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
}
分享到:
相关推荐
JDK7,即Java SE 7(标准版7),2011年推出,引入了显著的语法改进,例如try-with-resources语句,用于自动关闭资源,增强了switch语句,允许使用字符串作为case标签,以及对多路复用文件I/O的支持。此外,JDK7还...
3. **文本块**:新增的文本块语法简化了多行字符串的编写。 4. **局部变量类型推断**:使用`var`关键字,编译器可以根据初始值自动推断局部变量的类型。 5. **静态导入改进**:可以使用`import static *`导入所有...
JDK 1.8继续对`String`类进行改进,特别是在字符串操作的性能和内存使用上。 #### 新特性与优化 - ** equals() 和 intern() 的优化**:1.8对`equals()`和`intern()`进行了优化,提高了比较和查找效率。现在`equals...
总结来说,JDK 8对字符串拼接进行了优化,当字符串拼接在编译时可确定时,编译器会自动转换为使用`StringBuilder`。然而,对于运行时动态拼接的情况,开发者仍需手动使用`StringBuilder`或`StringBuffer`以获得最佳...
3. **字符串inswitch**:在switch语句中直接使用字符串,增加了灵活性。 4. **钻石操作符**:编译器能够自动推断出泛型实例化时的类型参数,使得代码更简洁。 5. **类型注解**:允许在类型签名的任何位置使用注解...
5. **字符串处理**:Guava提供了一系列的字符串处理工具,如Joiner、Splitter、CharMatcher等,使字符串操作更加方便和高效。例如,Joiner可以方便地将多个字符串连接成一个,Splitter可以按特定规则分割字符串。 6...
文本块(Text Blocks)允许更直观地处理多行字符串,减少了转义字符的困扰;还有记录类(Records),这是一种新型的类声明,自动提供了构造函数、equals、hashCode和toString方法,使得数据持有类的编写更加简洁。 ...
总的来说,这个压缩包为在Linux环境下进行Java开发和部署提供了基础环境,使用者可以根据自己的需求对JDK和Tomcat进行进一步的配置和优化。对于初学者,这是一份很好的实践材料;对于经验丰富的开发者,这则提供了一...
字符串连接作为字符串操作中最常见的场景之一,其性能优化对于提升应用效率至关重要。本文将深入探讨在Java中使用不同方法进行字符串连接时的性能差异,特别是针对“+”运算符与`StringBuffer`类在大量字符串连接...
2. **字符串在常量池中的 intern()**:字符串常量池优化,提高了性能。 3. **钻石操作符**:自动类型推断,如`List<String> list = new ArrayList();` 4. **try-with-resources**:自动关闭资源,提高了代码的可读性...
字符串类`String`和`StringBuilder`也得到了一些优化,如`String`的`join()`方法和`StringBuilder`的`appendCodePoint()`方法。 综上所述,JDK 1.8 API中文文档涵盖了这些重要的新特性,对于Java开发者来说,深入...
9. **String的优化**:JDK1.8对字符串进行了优化,例如新增了`String.join()`方法,以及`StringBuilder`和`StringBuffer`的改进,提升了字符串操作的效率。 10. **Optional类**:为了解决Java中的null安全问题,JDK...
6. **字符串拼接优化**:JDK 7对字符串拼接进行了优化,使用StringBuilder或StringBuffer时,如果拼接的对象是字符串常量,编译器会自动优化为使用`+`操作符,避免了不必要的对象创建。 7. **动态语言支持**:JDK 7...
例如,创建一个不可变的字符串列表: ```java List<String> list = List.of("One", "Two", "Three"); ``` 以上只是JDK1.8 API中部分重要的新特性与知识点,实际使用中还有许多其他改进,如Nashorn JavaScript引擎...
自动封箱和解封在JDK5.0中进行了优化,确保类型安全,避免了因隐式类型转换可能导致的错误。 8. **注解(Annotations)**: 注解提供了一种元数据机制,允许在代码中添加信息,用于编译器、构建工具或运行时系统...
3. **字符串开关(Switch Statement for Strings)**: JDK 1.7允许在switch语句中直接使用字符串,增强了语言的表达能力。 4. **动态类型语言支持**: 支持Groovy、Scala等动态类型语言的字节码,通过 invokedynamic...
2. **正则表达式模拟器**:正则表达式是一种强大的文本处理工具,用于匹配、查找、替换字符串模式。正则表达式模拟器通常是一个图形用户界面的应用程序,允许用户输入正则表达式并实时测试其效果,有助于开发者在...
这个版本引入了大量的新特性,优化和改进,极大地提升了Java编程的效率和灵活性。本API HTML文档是开发者学习和查阅Java 1.5 API的重要参考资料,下面将详细介绍其中的一些关键知识点。 1. **泛型(Generics)** ...
此外,字符串拼接也是常见的操作,Java提供多种方式进行字符串拼接,如`+`运算符、StringBuilder或StringBuffer。使用`+`运算符时,如果涉及字符串常量,JVM会在编译时进行优化,合并常量字符串。但对于运行时的动态...