`
hejiajunsh
  • 浏览: 410101 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Java解惑之String的"+"一定差于StringBuilder的append吗?

阅读更多

1)代码:

Java代码  收藏代码
  1. public static String s1() {  
  2.     String result = "";  
  3.   
  4.     result += "A";  
  5.     result += "B";  
  6.     result += "C";  
  7.   
  8.     return result;  
  9. }  
  10.   
  11. public static String s2() {  
  12.     String result = "";  
  13.     result = "A" + "B" + "C";  
  14.   
  15.     return result;  
  16. }  
  17.   
  18. public static String s3() {  
  19.     StringBuilder result = new StringBuilder();  
  20.     result.append("A").append("B").append("C");  
  21.     return result.toString();  
  22. }  

 

2)结论:性能上s2 > s3 > s1

3)分析:

Javap查看字节码:

 

由上图可知:

s1方法:3次创建StringBuilder对象,6次调用append方法添加字符串,3次调用toString方法把添加后的结果返回给result,三者之中,性能最差。

s2方法:编译器对“+”进行优化,合并"A"+"B"+"C"为“ABC”,直接赋给result,三者之中,性能最好。

s3方法:1次创建StringBuilder对象,3次调用append方法添加字符串,1次调用toString方法把添加后的结果返回给result,三者之中,性能居中。

 

4)总结:

  • 在做字符串的连接操作时,append方法未必是最好的。
  • 等号右侧有变量参与的字符串“+”操作(例如:result += "A"),jvm在做连接时,是创建一个新的StringBuilder对象,然后使用其append方法来实现连接,等号右侧没有变量参与的字符串“+”操作(例如:result = "A" + "B" + "C"),jvm在做连接时,会对右侧的连接操作进行优化,将其合并成一个字符串,然后赋给左边的变量,此时就变成了一次简单的赋值过程。

 

 

5)补充

5.1)代码:

Java代码  收藏代码
  1. public static String s4() {  
  2.     String result = "";  
  3.     result = result + "A" + "D";  
  4.   
  5.     return result;  
  6. }  
  7.       
  8. public static String s5() {  
  9.     String result = "";  
  10.     result += "A" + "D";  
  11.   
  12.     return result;  
  13. }  

 

5.2)分析:

Javap查看字节码: 

 

由上图可知:

s4方法:1次创建StringBuilder对象,3次调用append方法添加字符串(A和D各占一次),1次调用toString方法把添加后的结果返回给result。

s5方法:1次创建StringBuilder对象,2次调用append方法添加字符串(A和D经优化变成AD,所以A和D加起来仅占一次),1次调用toString方法把添加后的结果返回给result。

 

5.3)总结:

  • s4和s5中等号右侧都有变量参于进行字符串的“+”操作(result),所以都会创建StringBuilder对象,并使用其append方法实现连接。
  • s4中使用的是“=”,所以等号右侧显式的指出了result变量参与字符串的“+”操作,在这种情况下,A和D分两次append完成,而s5中使用的是“+=”,所以等号右侧隐式的指出了result变量参与字符串的“+”操作,在这种情况下,A、D合并成AD,一次append完成。
  • 1)我们最终想要的是什么?
    我们最终想要是一个字符串,用更加准确一点的语言来说,我们最终想要是在堆上开辟一块内存,在该内存中放入我们想要的字符串,然后把该内存的起始地址返回并放入我们的变量中,以使我们持有对该内存的引用。

    2)StringBuilder(或StringBuffer)的作用是什么?
    StringBuilder的作用是为了帮住我们完成上面的操作。

    3)为什么要用StringBuilder来完成?
    因为String对象是不可变的,如果要想对现有的String对象做修改,我们必须借助StringBuilder这一中间对象,不管我们是自己创建一个StringBuilder还是jvm帮我们创建。

    4)通过StringBuilder我们怎样才能得到我们想要的字符串?
    通过调用StringBuilder的toString方法来返回我们的字符串,确切的说应该是返回StringBuilder帮我们维护的堆上一块内存的引用,在该内存中StringBuilder已经把我们想要的字符串放到里面了。

    5)调用完StringBuilder的toString之后,StringBuilder会怎样?
    StringBuilder会消亡,因为它的生命周期已经结束。

    6)那我们最终得到的是什么?
    我们最终得到的就是我们想要的,即:堆上分配的一块存放我们最终想要字符串的内存,并且这块内存的起始地址已经放到了我们的变量中,我们已经持有了对该内存的引用。

    通过上面的分析我们可以看到,StringBuilder只是一个中间态,它的作用只是帮助我们完成我们想要的操作,达到目的,StringBuilder便会消亡,但这个中间态的出现必然会占用内存(例如它的类的加载,它的实例对象的创建),如果我们可以避开这个中间态(上面的s2方法中说的那种情况),那性能自然就会提高,虽然我没试过。
分享到:
评论
1 楼 sessionsong 2013-09-04  
写的很好! 学习了 !

相关推荐

    测试string的+和String.Format()和StringBuilder.Append()性能差距|TestForString.7z

    本测试着重探讨了三种常用的字符串连接方法:`+`运算符、`String.Format()`以及`StringBuilder.Append()`,并分析了它们在性能上的差异。 1. **字符串连接:+ 运算符** 在C#中,`+`运算符可以用于连接两个或多个...

    String StringBuffer和StringBuilder区别之源码解析

    "String StringBuffer和StringBuilder区别之源码解析" 在Java中,字符串是我们经常使用的数据类型,而String、StringBuffer和StringBuilder是Java中三种常用的字符串类。在这篇文章中,我们将从源码角度对String、...

    Java-Java String和StringBuilder

    在Java编程语言中,String和StringBuilder是两个非常重要的类,它们在处理文本字符串时起着核心作用。了解这两个类的特点和使用场景对于提高程序性能至关重要。 首先,`String`类在Java中是不可变的,这意味着一旦...

    String、StringBuffer、StringBuilder的使用方法

    在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`是处理字符串的三个重要类,它们各自有特定的使用场景和优缺点。理解它们的差异对于编写高效的代码至关重要。 **String类** `String`是不可变的类,...

    String ,StringBuffer与StringBuilder

    在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String 对象,就不能修改它的值。每次对 String 对象的...

    String和StringBuilder效率测试

    在Java编程语言中,`String`和`StringBuilder`都是用于处理字符串的重要类,但它们在处理方式和效率上有显著的区别。本资源中的代码是针对这两种类的效率进行测试的实例,旨在帮助开发者理解它们在不同场景下的性能...

    区分java中String+String和String+char

    在Java编程语言中,字符串操作是常见的任务,而`String`类提供了多种方式来组合或连接字符串。本文将深入探讨`String+String`和`String+char`这两种不同操作之间的区别。 首先,我们要理解Java编译器的优化机制。在...

    String、StringBuilder和StringBuffer的区别

    在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的类,它们之间存在一些重要的区别,主要涉及到性能和线程安全性。 首先,`String`类代表的是字符串常量,一旦创建,其内容就不能改变。...

    《剑指offer》Java-String、StringBuffer 和 StringBuilder 的区别.pdf

    在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的对象,但它们之间存在显著的区别。String是最常见的字符串类型,它的特点是不可变性。这意味着一旦一个String对象被创建,就不能进行...

    java CharSequence、String、StringBuffer、StringBuilder详解

    在Java编程语言中,`CharSequence`是一个接口,它是字符序列的抽象基类,包括`String`、`StringBuffer`和`StringBuilder`等类。理解这些类的特点和用途是优化程序性能的关键。以下是对这些概念的详细解释: 1. `...

    String和StringBuilder类的区别

    ### String和StringBuilder类的区别 在.NET框架中,`String` 和 `StringBuilder` 是两种非常重要的字符串处理类。尽管它们都能用来表示和操作文本数据,但它们之间存在显著的区别,主要体现在内存使用、性能表现...

    String-StringBuffer-StringBuilder

    在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`都是用来处理字符串的类,但它们之间存在显著的差异,主要体现在性能、线程安全性和使用场景上。 首先,`String`是最基本的字符串类,它代表的是不可...

    从内存方面解释Java中String与StringBuilder的性能差异.docx

    在Java编程中,String与StringBuilder都是用来处理字符串的类,但它们在性能上有显著的差异,这主要体现在内存管理和操作效率上。理解这些差异对于优化代码性能至关重要。 首先,String对象在Java中是不可变的,这...

    Java中String,StringBuffer与StringBuilder的区别

    Java 中 String, StringBuffer 与 StringBuilder 的区别 Java 中 String, StringBuffer 与 StringBuilder 三种字符串类型的区别是很多开发者经常混淆或不了解的知识点。今天,我们将深入探讨这三种字符串类型的区别...

    java中stringBuilder的用法

    stringbuilder用法 java中stringBuilder的用法java中stringBuilder的用法java中stringBuilder的用法java中stringBuilder的用法java中stringBuilder的用法java中stringBuilder的用法java中stringBuilder的用法java中...

    String&StringBuffer&StringBuilder三者之间的区别-经典解析.doc

    在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的重要类,它们各自有特定的使用场景和特性。理解这三个类的区别对于任何Java开发者,无论是初学者还是经验丰富的程序员,都是非常重要的...

    String、StringBuffer与StringBuilder之间区别

    String:字符串常量  StringBuffer:字符创变量  StringBuilder:字符创变量  从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段...

    Java StringBuilder

    Java中的`StringBuilder`类是处理字符串的一个重要工具,特别是在需要频繁进行字符串操作的场景下,它的性能优于传统的`String`类。这是因为`String`在Java中是不可变对象,每次修改都会创建一个新的字符串实例,而`...

    String及StringBuffer和StringBuilder的区别

    String、StringBuffer 和 StringBuilder 是 Java 语言中三种不同类型的字符串处理方式,它们之间存在着明显的性能和线程安全性差异。 String String 类型是不可变的对象,每次对 String 对象进行改变时都会生成一...

Global site tag (gtag.js) - Google Analytics