`
wang吖
  • 浏览: 238407 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

String连接字符串一定比StringBuffer、StringBuilder慢吗?

 
阅读更多
本文标题没有实际含义,看看实例,  (本文为转载 …………) 大笑
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
 而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:
 String S1 = “This is only a” + “ simple” + “ test”;
 StringBuffer Sb = new StringBuffer(“This is only a”).append(“ simple”).append(“ test”);
 你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
 String S1 = “This is only a” + “ simple” + “test”; 其实就是:
 String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做

在大部分情况下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。
在大部分情况下 StringBuilder > StringBuffer
java.lang.StringBuilde
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
上个测试代码:
public class DemoStr {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		int cnt = 100000;

		String S1 = "";
		long start1 = System.currentTimeMillis();
		for (int i = 0; i < cnt; i++) {
			S1 = "This is only a" + "simple" + "test";
		}
		long end1 = System.currentTimeMillis();
		String S2 = "This is only a";
		String S3 = "simple";
		String S4 = "test";
		String SS = "";
		long start2 = System.currentTimeMillis();
		for (int i = 0; i < cnt; i++) {
			SS = S2 + S3 + S4;
		}
		long end2 = System.currentTimeMillis();

		System.out.println("String ++++ :  " + (end1 - start1));
		System.out.println("String变量 ++++:  " + (end2 - start2));

		StringBuffer Sb = new StringBuffer("");
		long start3 = System.currentTimeMillis();
		for (int i = 0; i < cnt; i++) {
			// StringBuffer Sb = new StringBuffer("");
			Sb.append(S2).append(S3).append(S4);
			Sb.setLength(0);
		}
		long end3 = System.currentTimeMillis();
		System.out.println("StringBuffer变量 ++++:  " + (end3 - start3));

	}
}
 
输出结果印证文章开头:
String ++++ :  2
String变量 ++++:  40
StringBuffer变量 ++++:  20
 
追加一个例子:
 "hello"和new String("hello")的区别:

常量池指的是在编译期被确定、并被保存在已编译的.class文件中的一些数据,包括关于类、方法、接口中的常量和字符串常量。

String a=”ab”;
String b=”cd”;
String c=”abcd”;
String d=”ab”+”cd”;
String e=a+b;
String f=new string (“ab”);
c==d(√)      
f==a(×)
c==e(×)——>e指向的是a、b的复合地址,c和d指向的是“abcd”的地址.
java会确保每个字符串常量只有一个,不会产生对个副本

 

测试代码:

                String a = "ab";
		String b = "cd";
		String c = "abcd";
		String d = "ab" + "cd";
		String e = a + b;
		String f = new String("ab");
		System.out.println(c == d);
		System.out.println(f == a);
		System.out.println(c == e);

 

分享到:
评论

相关推荐

    String StringBuffer和StringBuilder区别之源码解析

    在Java中,字符串是我们经常使用的数据类型,而String、StringBuffer和StringBuilder是Java中三种常用的字符串类。在这篇文章中,我们将从源码角度对String、StringBuffer和StringBuilder进行深入分析,了解它们之间...

    String ,StringBuffer与StringBuilder

    在字符串连接操作中,StringBuffer 的效率要比 String 高。例如,String str = new String("welcome to ");str += "here";的处理步骤实际上是通过建立一个 StringBuffer,让它调用 append(),最后再将 StringBuffer ...

    String、StringBuffer与StringBuilder之间区别

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

    String、StringBuilder和StringBuffer的区别

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

    String、StringBuffer、StringBuilder的使用方法

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

    String及StringBuffer和StringBuilder的区别

    但是,在某些特别情况下,String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢。 线程安全性 StringBuffer 是线程安全的,而 ...

    String-StringBuffer-StringBuilder

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

    Java中String,StringBuffer与StringBuilder的区别

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

    字符串数组转换成string类型的

    在编程领域,尤其是在使用C++、Java或C#等面向对象的语言时,经常需要将字符串数组转换为单一的string类型。这种操作在处理数据输入、输出或者格式化时非常常见。下面我们将详细讨论如何在不同语言中实现这个过程,...

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

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

    string和StringBuffer的区别

    性能对比:当字符串需要多次修改时,`StringBuffer`或`StringBuilder`比`String`更优,因为`String`每次修改都会创建新对象,消耗更多内存和时间。尤其是在循环中拼接字符串,`StringBuffer`或`StringBuilder`的性能...

    String、StringBuilder、StringBuffer的区别

    再次,从字符串处理方式方面来说,String 是字符串常量,StringBuilder 和 StringBuffer 是字符串变量。String 的不可改变性使得每次操作时都需要创建新的对象,而 StringBuilder 和 StringBuffer 的可改变性使得...

    StringBuilder字符串拼接工具

    在处理大量字符串连接时,相比直接使用`+`运算符或`String`对象,`StringBuilder`能提供更高的性能。这是因为每次使用`+`进行字符串连接时,Java都会创建新的`String`对象,这在内存管理和效率上都是不理想的。而`...

    你知道String、StringBuffer和StringBuilder的区别吗

    在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的重要类,它们各自具有不同的特性和使用场景。下面将详细解析这三个类的区别。 首先,`String`类是最基础的字符串处理类,它被设计为不...

    String和StringBuffer的区别

    在Java编程语言中,`String`和`StringBuffer`都是用来表示和操作字符串的重要类,但它们在性能和使用场景上有显著的区别。 首先,`String`类是不可变的,这意味着一旦创建了一个`String`对象,它的内容就不能改变。...

    Java 中操作字符串都有哪些类?它们之间有什么区别?

    String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要...

    浅谈java中String StringBuffer StringBuilder的区别

    在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的类,但它们之间存在显著的性能和功能差异。下面我们将深入探讨这三个类的区别。 首先,`String`类是Java中最基本的字符串类型,它表示...

    StringBuffer、StringBuilder、String

    在Java中,有几种不同的方式可以用来创建和修改字符串,其中最常用的是`String`、`StringBuffer`和`StringBuilder`。本文将详细介绍这三种类型的字符串及其区别,特别是`StringBuffer`和`StringBuilder`之间的差异。...

    StringBuffer 和 StringBuilder 类

    在Java编程中,当我们需要对字符串进行多次修改时,StringBuffer和StringBuilder类成为首选。这两个类提供了一种高效且灵活的方式来处理字符串,与不可变的String类相比,它们能避免创建大量未使用的对象,从而提高...

Global site tag (gtag.js) - Google Analytics