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区别之源码解析" 在Java中,字符串是我们经常使用的数据类型,而String、StringBuffer和StringBuilder是Java中三种常用的字符串类。在这篇文章中,我们将从源码角度对String、...
### String和StringBuilder类的区别 在.NET框架中,`String` 和 `StringBuilder` 是两种非常重要的字符串处理类。尽管它们都能用来表示和操作文本数据,但它们之间存在显著的区别,主要体现在内存使用、性能表现...
在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的类,它们之间存在一些重要的区别,主要涉及到性能和线程安全性。 首先,`String`类代表的是字符串常量,一旦创建,其内容就不能改变。...
String:字符串常量 StringBuffer:字符创... StringBuilder:字符创变量 从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:
stringbuilder用法 String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String...
在Java编程语言中,`String`、`...理解`String`、`StringBuffer`和`StringBuilder`的区别和使用场合,可以帮助开发者写出更高效、更安全的代码。在实际开发中,应根据项目需求和环境选择合适的字符串处理类。
String、StringBuilder、StringBuffer的区别 在 Java 中,String、StringBuilder 和 StringBuffer 三者都是字符串处理类,但是它们之间存在着本质的区别。本文将从执行速度、线程安全性、字符串处理方式等方面对这...
在Java编程语言中,`String`和`StringBuilder`都是用于处理字符串的重要类,但它们在处理方式和效率上有显著的区别。本资源中的代码是针对这两种类的效率进行测试的实例,旨在帮助开发者理解它们在不同场景下的性能...
String, StringBuffer 与 StringBuilder 的区别 在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String ...
String、StringBuilder以及StringBuffer的区别
StringBuilder 类型是可变的对象,提供了与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。StringBuilder 在大多数实现中比 ...
在Java编程语言中,String和StringBuilder是两个非常重要的类,它们在处理文本字符串时起着核心作用。了解这两个类的特点和使用场景对于提高程序性能至关重要。 首先,`String`类在Java中是不可变的,这意味着一旦...
Java中的String和StringBuilder都是用来处理字符串的类,但它们在使用和性能上有显著区别。String是不可变的对象,这意味着一旦创建了String对象,就不能更改它的值。每次对String进行修改,实际上是创建了一个新的...
在Java编程中,String与StringBuilder都是用来处理字符串的类,但它们在性能上有显著的差异,这主要体现在内存管理和操作效率上。理解这些差异对于优化代码性能至关重要。 首先,String对象在Java中是不可变的,这...
C#中String和StringBuilder的简介与区别 String类型对象的特点: 1.它是引用类型,在堆上分配内存 2.运算时会产生一个新的实例 3.String 对象一旦生成不可改变(Immutable) 4.定义相等运算符(== 和 !=)是为了...
String,StringBuilder,StringBuffer
Java 中 String, StringBuffer 与 StringBuilder 的区别 Java 中 String, StringBuffer 与 StringBuilder 三种字符串类型的区别是很多开发者经常混淆或不了解的知识点。今天,我们将深入探讨这三种字符串类型的区别...
本测试着重探讨了三种常用的字符串连接方法:`+`运算符、`String.Format()`以及`StringBuilder.Append()`,并分析了它们在性能上的差异。 1. **字符串连接:+ 运算符** 在C#中,`+`运算符可以用于连接两个或多个...
day13-String和StringBuilder 1.String类 1.1字符串的比较【理解】 1.1.1==号的作用 比较基本数据类型:比较的是具体的值 比较引用数据类型:比较的是对象地址值 1.1.2equals方法的作用 方法介绍 示例代码 ...