`

String的重载“+”和StringBuilder效率的巨大区别的实验

    博客分类:
  • java
阅读更多
本程序是根据Thinking in Java简单改编而成。
package strings;

import java.util.Date;
import static net.mindview.util.Print.*;


/*
 * 此程序是为了证明重载“+”和StringBuilder的巨大区别
 * 这个程序是为了证明在使用到toString()方法的循环中,最好是自己创建一个StringBuilder对象,用它来构造最终的结果,
 * 这样可以省去很多的JVM的后台处理,大大的提高效率。经过1万次循环测试发现用“+”重载的循环时间共用了800毫秒左右,而用了
 * StringBuilder的耗时竟然是0毫秒,相差太大了……
 */
public class WhitherStringBuilder {
	public String implicittest(int j){
		String result="";
		for(int i=0;i<j;i++){
			result+=i;
		}
		return result;
	}
	public String explicittest(int j){
		StringBuilder result= new StringBuilder();
		for(int i=0 ; i<j ;i++){
			result.append(i);
		}
		return result.toString();
	}
	public static void main(String[]arges){
		WhitherStringBuilder p = new WhitherStringBuilder();
		String result = "";
		long timeBefor = new Date().getTime();
//		result =p.implicittest(10000);
		result =p.explicittest(10000);
		long timeBehind = new Date().getTime();
		print(timeBehind-timeBefor);
		print(result.substring(0, 100));
	}

}
分享到:
评论
2 楼 lhbthanks 2013-07-10  
java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。通常,如果 sb 引用 StringBuilder 的一个实例,则 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果。只要发生有关源序列(如在源序列中追加或插入)的操作,该类就只在执行此操作的字符串缓冲区上而不是在源上实现同步。每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。 java.lang.StringBuilder一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。例如,如果 z 引用一个当前内容为“start”的字符串生成器对象,则该方法调用 z.append("le") 将使字符串生成器包含“startle”,而 z.insert(4, "le") 将更改字符串生成器,使之包含“starlet”。通常,如果 sb 引用 StringBuilder 的实例,则 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果。 每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer。
1 楼 lcy0202 2012-06-12  
有测试过stringbuffer和+的效率区别吗,保证线程安全的情况下,会不会比stringbuilder有所下降

相关推荐

    StringBuilder的用法

    2. 设置容量和长度:可以使用重载的构造函数之一来指定 StringBuilder 类的容量,例如 StringBuilder MyStringBuilder = new StringBuilder("Hello World!", 25);。也可以使用读/写 Capacity 属性来设置对象的最大...

    string与stringbuilder两者的区别

    在.NET Framework中,string和StringBuilder都是字符串处理的重要工具,但是它们之间存在着很大的区别。 首先,从定义上来说,string是不可改变的对象,每次使用System.String类中的方法之一时,都要在内存中创建一...

    stringBuilder完整版.pdf

    通过用一个重载的构造函数方法初始化变量,可以创建 StringBuilder 类的新实例,正如以下示例中所阐释的那样。 设置容量和长度 虽然 StringBuilder 对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您...

    StringBuilder类

    与String不同,String对象的长度是固定的,一旦创建,其内容无法改变,每次对字符串进行修改都会生成新的对象,这在处理大量字符串拼接时会显著降低程序效率。而StringBuilder则提供了可变字符串的功能,它允许我们...

    java中stringBuilder的用法详解

    可以使用重载的构造函数方法初始化 StringBuilder 变量,例如 `StringBuilder MyStringBuilder = new StringBuilder("Hello World!");`。也可以指定 StringBuilder 的容量,例如 `StringBuilder MyStringBuilder = ...

    StringBuilder用法

    stringbuilder用法String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 ...

    重载重写、接口、抽象类、String指针和字符串拼接、异常catch、throw、throws、字符流和字节流

    重载是在同一个类中实现的,它提高了代码的可读性和复用性。 2. **方法重写(Overriding)**:当子类中出现与父类同名且参数列表完全相同的方法时,我们称这种方法为重写方法。方法重写增强了多态性,子类可以覆盖...

    C++String类

    2. **拷贝构造函数与赋值运算符**:这是C++中的深拷贝和浅拷贝问题,`String`类需要重载这两个来确保当一个`String`对象被复制时,底层的数据也得到正确处理。这涉及到动态内存管理,防止悬挂指针和内存泄漏。 3. *...

    面试总结java工程师

    本文总结了 Java 面试中的重要知识点,涵盖了基本数据类型、抽象类和接口、方法重载和重写、String、StringBuffer 和 StringBuilder 三者的区别、判断字符串是否为空、集合的理解等方面。 1. 基本数据类型 Java 中...

    C#实验大纲(10级专科软件技术NET).pdf

    学生需要理解属性的作用,实现运算符+和-的重载,以及创建变形金刚和汽车类之间的转换。同时,设计具有索引器的类,能够根据数字和英文月份名获取对应天数。 实验七重点讲解继承和多态。学生需要通过设计点类(Point...

    C#中StringBuilder类的使用总结

    String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建...通过用一个重载的构造函数方法初始化变量,可以创建 StringBuilder 类的新实例,正如以下示例中所阐释的那样。 StringBuilder

    C#实验大纲(10级专科软件技术NET).docx

    实验四主要讲解字符串和正则表达式,要求学生能熟练运用String、StringBuilder类,以及简单的正则表达式。实验任务包括统计特定字符出现次数、构建个人简介、提取手机号码和处理混合文本,以此提升字符串处理和模式...

    Java 面试题.docx

    因此,对于多次拼接操作,StringBuffer和StringBuilder比String更高效。 - 在多线程环境中,StringBuffer是线程安全的,而StringBuilder不是。因此,在单线程环境下,StringBuilder的性能优于StringBuffer,因为没有...

    java学科面试宝典v7.0.pdf

    1.2 String、StringBuffer和StringBuilder的区别: - String:由于String类的对象是用final修饰的char数组存储,且被声明为private和final,所以是不可变的。每次对String对象进行改变时,都会生成新的对象并改变...

    面试必问Java面试题,对标初级Java

    15.String、StringBuffer、StringBuilder区别以及使用场景 16.重载和重写的区别(区别无参构造和有参) 17.Java中异常处理机制 18.java中==equals有哪些区别 19.ArrayList和LinkedList有什么区别 20.Java面向对象有...

    大整数加法减法 完整算法 写一个表示大整数(>2256)的对象( C++或Java),能实现 +,-,*,/(运算符重载)(

    在编程领域,处理大整数是一项常见的挑战,尤其是在需要进行精确计算或者数学运算的应用中。在C++和Java中,由于内置的整型数据类型...对于乘法和除法,可以进一步研究和实现高效率的算法,以提高大整数计算的性能。

    Java语法基础-面试专题及答案

    12.String StringBuffer 和 StringBuilder 的区别是什么 String 为什么是不可变的 可变性、线程安全性的研究 13.自动装箱与拆箱 14.在一个静态方法内调用一个非静态成员为什么是非法的 15.在 Java 中定义一个不做事...

    java面试精选必备题集

    * 重载和重写的区别 + 重载:同名方法,参数列表不同 + 重写:子类重写父类的方法 * 抽象类和接口的区别 + 抽象类:提供默认实现,子类可以继承 + 接口:纯抽象,子类必须实现所有方法 二、Java集合 1.2 Java...

Global site tag (gtag.js) - Google Analytics