`
chenguanwei2008
  • 浏览: 121065 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

String与StringBuilder的区别

    博客分类:
  • J2SE
阅读更多

String与StringBuilder最主要的区别体现在做字符串连接操作的效率上。

String使用重载运算符+或+=做字符串连接,有代码如下:

public class Concatenation {
	public static void main(String[] args) {
		String str = "My";
		String introduction = str + " name " + " is " + " cgw ";
		System.out.println(introduction);
	}
}

 通过javap进行反编译,我们可以得到JVM生成的字节码:

public Concatenation();
  Code:
   0:	aload_0
   1:	invokespecial	#1; //Method java/lang/Object."<init>":()V
   4:	return

public static void main(java.lang.String[]);
  Code:
   0:	ldc	#2; //String My
   2:	astore_1
   3:	new	#3; //class java/lang/StringBuilder
   6:	dup
   7:	invokespecial	#4; //Method java/lang/StringBuilder."<init>":()V
   10:	aload_1
   11:	invokevirtual	#5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   14:	ldc	#6; //String  name 
   16:	invokevirtual	#5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   19:	ldc	#7; //String  is 
   21:	invokevirtual	#5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   24:	ldc	#8; //String  cgw 
   26:	invokevirtual	#5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   29:	invokevirtual	#9; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   32:	astore_2
   33:	getstatic	#10; //Field java/lang/System.out:Ljava/io/PrintStream;
   36:	aload_2
   37:	invokevirtual	#11; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   40:	return

}

 我们可以看到,在main方法内,JVM是new了一个StringBuilder对象,并通过调用append方法进行字符串连接操作的。

 

既然这样,那么我们可以不考虑使用StringBuilder对象,而直接使用String,让JVM来为你自动进行优化呢?

请看下面代码:

import java.lang.StringBuilder;

public class WhitherStringBuilder {

	public String implicit(String[] fields) {
		String result = "";
		for(int i = 0 ; i < fields.length ; i++) {
			result += fields[i];
		}
		return result;
	}
	
	public String explicit(String[] fields) {
		StringBuilder result = new StringBuilder();
		for(int i = 0 ; i < fields.length ; i++) {
			result.append(fields[i]);
		}
		return result.toString();
	}

}
 

同样进行反编译得到:

public class WhitherStringBuilder extends java.lang.Object{
public WhitherStringBuilder();
  Code:
   0:	aload_0
   1:	invokespecial	#1; //Method java/lang/Object."<init>":()V
   4:	return

public java.lang.String implicit(java.lang.String[]);
  Code:
   0:	ldc	#2; //String 
   2:	astore_2
   3:	iconst_0
   4:	istore_3
   5:	iload_3
   6:	aload_1
   7:	arraylength
   8:	if_icmpge	38
   11:	new	#3; //class java/lang/StringBuilder
   14:	dup
   15:	invokespecial	#4; //Method java/lang/StringBuilder."<init>":()V
   18:	aload_2
   19:	invokevirtual	#5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   22:	aload_1
   23:	iload_3
   24:	aaload
   25:	invokevirtual	#5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   28:	invokevirtual	#6; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   31:	astore_2
   32:	iinc	3, 1
   35:	goto	5
   38:	aload_2
   39:	areturn

public java.lang.String explicit(java.lang.String[]);
  Code:
   0:	new	#3; //class java/lang/StringBuilder
   3:	dup
   4:	invokespecial	#4; //Method java/lang/StringBuilder."<init>":()V
   7:	astore_2
   8:	iconst_0
   9:	istore_3
   10:	iload_3
   11:	aload_1
   12:	arraylength
   13:	if_icmpge	30
   16:	aload_2
   17:	aload_1
   18:	iload_3
   19:	aaload
   20:	invokevirtual	#5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   23:	pop
   24:	iinc	3, 1
   27:	goto	10
   30:	aload_2
   31:	invokevirtual	#6; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   34:	areturn

}

 注意:

implicit方法为使用String的+操作进行字符串连接,观察字节码第8-35行,这是一个循环,你会发现,new StringBuilder对象的操作是在循环体内进行的,这说明每次循环都会创建一个新的StringBuilder对象。

explicit方法为使用StringBuilder对象的append方法进行字符串连接,JVM在第0行创建了StringBuilder对象,而循环是在第13至27行,这说明,使用StringBuilder进行字符串连接只会创建一个StringBuilder对象。

 

由以上得知StringBuilder的字符串连接操作效率要远远高于String。

 

另StringBuilder的效率要稍高于StringBuffer,因为StringBuffer的线程安全特性会造成额外的开销。

 

分享到:
评论

相关推荐

    String StringBuffer和StringBuilder区别之源码解析

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

    String和StringBuilder类的区别

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

    String、StringBuilder和StringBuffer的区别

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

    String、StringBuffer与StringBuilder之间区别

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

    String、StringBuilder、StringBuffer 用法比较

    stringbuilder用法 String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String...

    String、StringBuffer、StringBuilder的使用方法

    在Java编程语言中,`String`、`...理解`String`、`StringBuffer`和`StringBuilder`的区别和使用场合,可以帮助开发者写出更高效、更安全的代码。在实际开发中,应根据项目需求和环境选择合适的字符串处理类。

    String、StringBuilder、StringBuffer的区别

    String、StringBuilder、StringBuffer的区别 在 Java 中,String、StringBuilder 和 StringBuffer 三者都是字符串处理类,但是它们之间存在着本质的区别。本文将从执行速度、线程安全性、字符串处理方式等方面对这...

    String和StringBuilder效率测试

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

    String ,StringBuffer与StringBuilder

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

    String、StringBuilder以及StringBuffer的区别

    String、StringBuilder以及StringBuffer的区别

    String及StringBuffer和StringBuilder的区别

    StringBuilder 类型是可变的对象,提供了与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。StringBuilder 在大多数实现中比 ...

    Java-Java String和StringBuilder

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

    java中String与StringBuilder的区别

    Java中的String和StringBuilder都是用来处理字符串的类,但它们在使用和性能上有显著区别。String是不可变的对象,这意味着一旦创建了String对象,就不能更改它的值。每次对String进行修改,实际上是创建了一个新的...

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

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

    C#中String和StringBuilder的简介与区别

    C#中String和StringBuilder的简介与区别 String类型对象的特点: 1.它是引用类型,在堆上分配内存 2.运算时会产生一个新的实例 3.String 对象一旦生成不可改变(Immutable) 4.定义相等运算符(== 和 !=)是为了...

    String,StringBuilder,StringBuffer.xmind

    String,StringBuilder,StringBuffer

    Java中String,StringBuffer与StringBuilder的区别

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

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

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

    跟我学Java-day13-String和StringBuilder.pdf

    day13-String和StringBuilder 1.String类 1.1字符串的比较【理解】 1.1.1==号的作用 比较基本数据类型:比较的是具体的值 比较引用数据类型:比较的是对象地址值 1.1.2equals方法的作用 方法介绍 示例代码 ...

Global site tag (gtag.js) - Google Analytics