`
wang吖
  • 浏览: 235191 次
  • 性别: 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区别

    String,StringBuffer,StringBuilder区别。几乎所有的应用开发都离不开操作字符串,理解字符串的设计和实现以及相关 工具如拼接类的使用,对写出高质量代码是非常有帮助的

    String、StringBuffer与StringBuilder之间区别

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

    String ,StringBuffer与StringBuilder

    String ,StringBuffer与StringBuilder的区别

    StringBuffer 和 StringBuilder 类

    当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。   在使用 StringBuffer 类...

    Java StringBuffer & StringBuilder.pdf

    它们与String类类似,但是不同之处在于,StringBuffer和StringBuilder可以修改字符串内容,而String对象是不可变的; StringBuffer和StringBuilder类的用法基本相同,但StringBuilder类的效率更高,因为它不是线程...

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

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

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

    目录StringStringBuffer与StringBuilder总结 String 官方解释: String类是不可变类,即一旦一个...这两者基本相似,都是可变字符串对象,主要区别为线程是否安全。 总结 最后,引用菜鸟教程下的总结以及相关评论: S

    字符串解析

    字符串String StringBuffer StringBuilder

    面试题java StringBuffer和StringBuilder类常见操作和用法

    Java的StringBuffer和StringBuilder类是用于字符串操作的可变字符序列类。本文将介绍Java StringBuffer和StringBuilder类的常见操作和用法,包括创建、追加、插入、删除、替换、反转等操作。我们还会讨论如何获取...

    java--面试题大全(附答案

    答:Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类...

    Java中String、StringBuffer、StringBuilder的区别详解

    java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间有什么区别呢?下面小编给大家总结了Java中String、StringBuffer、StringBuilder的区别详解,需要的朋友参考下吧

    Java字符串连接原理

    我们都知道,在Java中字符串可以用+连接,也可以使用StringBuilder或StringBuffer连接。 String str = abc+xyz; 那么这几种方式由什么区别呢。当然你可能会知道以下几点 String是只读字符串,String引用的字符串...

    java三种字符串处理差别

    java字符串三种处理方式区别String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全)

    java 面对对象编程.pdf.zip

    面向对象基础 面向对象和面向过程的区别 ...字符串拼接用“+” 还是 StringBuilder? String#equals() 和 Object#equals() 有何区别? 字符串常量池的作用了解吗? String s1 = new String("abc");这句话创建了几个

    Java的String类讲解案例代码(String类使用:创建对象、比较、连接、截取、查找和替换、拆分...)StringBuf

    String字符串操作类的源码资源适用于具有编程基础的开发者,特别是那些需要对字符串进行各种操作和处理的开发者。 使用场景 该源码资源适用于任何需要对字符串进行处理的场景,包括但不限于文本分析、数据清洗、...

    辨析Java中的String与StringBuffer及StringBuilder字符串类

    里将为大家来辨析Java中的String与StringBuffer及StringBuilder字符串类型,通常来说StringBuilder的性能更加,需要的朋友可以参考下

    java面试问题总结

    2. StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,不像String一样创建一些对象进行操作,所以速度就快了。 3. StringBuilder :...

    Java String 类.pdf

    String类是Java中表示字符串的类。它是不可变的,一旦创建了一个字符串对象,就无法修改它。 二、String类和StringBuilder类有什么区别? String类和StringBuilder类的最主要区别在于可变性。String类是不可变的,...

    JavaScript 利用StringBuffer类提升+=拼接字符串效率

    JavaScript 利用StringBuffer类提升+=拼接字符串效率,需要的朋友可以参考下。

    Java String、StringBuffer、StringBuilder(基于源码探索)

    String、StringBuffer、StringBuilder 1、String String是Java类对象,Java通过String来创建和操作字符串。 从源码中我们可以看出,String使用byte[]数组进行字符串的存储,且byte[]数组被final关键字修饰。我们知道...

Global site tag (gtag.js) - Google Analytics