首页 Java java教程 stringbuffer和stringbuilder的区别

stringbuffer和stringbuilder的区别

Jun 04, 2019 pm 01:19 PM
stringbuffer

无论是做Java或是Android,都避免不了遇到这个问题,其实开发过程中一般情况下是不会纠结,这个问题是面试必选经典题,今天有时间,就总结一下。

stringbuffer和stringbuilder的区别

StringBuffer、StringBuilder区别

StringBuffer与 StringBuilder中的方法和功能完全是等价的,只是StringBuffer中的方法大都采用了synchronized关键字进行修饰,因此是线程安全的,支持并发操作,适合多线程中使用。StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。(推荐学习:JAVA视频教程

接下来,我直接贴上测试过程和结果的代码,一目了然:

public class StringTest {
 
	public static String BASEINFO = "Mr.Y";
	public static final int COUNT = 2000000;
 
	/**
	* 执行一项String赋值测试
	*/
	public static void doStringTest() {
 
		String str = new String(BASEINFO);
		long starttime = System.currentTimeMillis();
		for (int i = 0; i < COUNT / 100; i++) {
			str = str + "miss";
		}
		long endtime = System.currentTimeMillis();
		System.out.println((endtime - starttime)
				+ " millis has costed when used String.");
	}
 
	/**
	* 执行一项StringBuffer赋值测试
	*/
	public static void doStringBufferTest() {
 
		StringBuffer sb = new StringBuffer(BASEINFO);
		long starttime = System.currentTimeMillis();
		for (int i = 0; i < COUNT; i++) {
			sb = sb.append("miss");
		}
		long endtime = System.currentTimeMillis();
		System.out.println((endtime - starttime)
				+ " millis has costed when used StringBuffer.");
	}
 
	/**
	* 执行一项StringBuilder赋值测试
	*/
	public static void doStringBuilderTest() {
 
		StringBuilder sb = new StringBuilder(BASEINFO);
		long starttime = System.currentTimeMillis();
		for (int i = 0; i < COUNT; i++) {
			sb = sb.append("miss");
		}
		long endtime = System.currentTimeMillis();
		System.out.println((endtime - starttime)
				+ " millis has costed when used StringBuilder.");
	}
 
	/**
	* 测试StringBuffer遍历赋值结果
	* 
	* @param mlist
	*/
	public static void doStringBufferListTest(List<String> mlist) {
		StringBuffer sb = new StringBuffer();
		long starttime = System.currentTimeMillis();
		for (String string : mlist) {
			sb.append(string);
		}
		long endtime = System.currentTimeMillis();
		System.out.println(sb.toString() + "buffer cost:"
				+ (endtime - starttime) + " millis");
	}
 
	/**
	* 测试StringBuilder迭代赋值结果
	* 
	* @param mlist
	*/
	public static void doStringBuilderListTest(List<String> mlist) {
		StringBuilder sb = new StringBuilder();
		long starttime = System.currentTimeMillis();
		for (Iterator<String> iterator = mlist.iterator(); iterator.hasNext();) {
			sb.append(iterator.next());
		}
 
		long endtime = System.currentTimeMillis();
		System.out.println(sb.toString() + "builder cost:"
				+ (endtime - starttime) + " millis");
	}
 
	public static void main(String[] args) {
		doStringTest();
		doStringBufferTest();
		doStringBuilderTest();
 
		List<String> list = new ArrayList<String>();
		list.add(" I ");
		list.add(" like ");
		list.add(" BeiJing ");
		list.add(" tian ");
		list.add(" an ");
		list.add(" men ");
		list.add(" . ");
 
		doStringBufferListTest(list);
		doStringBuilderListTest(list);
	}
 
}
登录后复制

看一下执行结果:

2711 millis has costed when used String.
211 millis has costed when used StringBuffer.
141 millis has costed when used StringBuilder.
 I  like  BeiJing  tian  an  men  . buffer cost:1 millis
 I  like  BeiJing  tian  an  men  . builder cost:0 millis
登录后复制

从上面的结果可以看出,不考虑多线程,采用String对象时(我把Count/100),执行时间比其他两个都要高,而采用StringBuffer对象和采用StringBuilder对象的差别也比较明显。由此可见,如果我们的程序是在单线程下运行,或者是不必考虑到线程同步问题,我们应该优先使用StringBuilder类;如果要保证线程安全,自然是StringBuffer。

从后面List的测试结果可以看出,除了对多线程的支持不一样外,这两个类的使用方式和结果几乎没有任何差别。

更多JAVA相关技术文章,请访问JAVA开发教程栏目进行学习!

以上是stringbuffer和stringbuilder的区别的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在Java中,我们如何比较StringBuilder和StringBuffer? 在Java中,我们如何比较StringBuilder和StringBuffer? Aug 28, 2023 pm 03:57 PM

StringBuffer对象通常可以安全地在多线程环境中使用,其中多个线程可能会尝试访问同一个StringBuffer对象同时。StringBuilder是线程安全的StringBuffer类的替代品,它的工作速度要快得多,因为它没有同步>方法。如果我们在单个线程中执行大量字符串操作,则使用此类可以提高性能。示例publicclassCompareBuilderwithBufferTest{  publicstaticvoidmain(String[]a

使用StringBuffer类的toString()方法将StringBuffer转换为字符串 使用StringBuffer类的toString()方法将StringBuffer转换为字符串 Jul 25, 2023 pm 06:45 PM

使用StringBuffer类的toString()方法将StringBuffer转换为字符串在Java中,StringBuffer类是用于处理可变字符串的类,它提供了许多方便的方法来修改和操作字符串。当我们需要将一个StringBuffer对象转换为字符串时,可以使用toString()方法来实现。StringBuffer类的toString()方法返回一

使用StringBuffer类的reverse()方法来反转字符串 使用StringBuffer类的reverse()方法来反转字符串 Jul 24, 2023 pm 04:41 PM

使用StringBuffer类的reverse()方法来反转字符串在编程中,我们经常需要对字符串进行一些操作,例如反转字符串。在Java中,可以使用StringBuffer类的reverse()方法来实现字符串反转。下面让我们一起来了解一下这个方法的使用。首先,我们需要创建一个StringBuffer对象,将要反转的字符串作为参数传递给它的构造函数,如下所示

如何在Java中使用String类、StringBuffer和StringBuilder? 如何在Java中使用String类、StringBuffer和StringBuilder? Apr 21, 2023 pm 07:22 PM

String类基本概念String类属于引用数据类型,不属于基本数据类型。在Java中只要是""(双引号)中的,都是String对象。java中规定,双引号中的字符串是不可变的,也就是说"abc"自出生到死亡都不可能变成"abcd",也不能变成"ab"。在JDK中双引号括起来的字符串都是存储在方法区的字符串常量池当中的。(因为在实际开发中,字符串的使用频率十分高,为了执行效率,就把字符串放在了方法区中的字符串常量池当

使用StringBuffer类的substring()方法获取字符串部分内容的子串 使用StringBuffer类的substring()方法获取字符串部分内容的子串 Jul 24, 2023 pm 12:41 PM

使用StringBuffer类的substring()方法获取字符串部分内容的子串在Java编程中,经常需要对字符串进行处理和操作。StringBuffer类是一个常用的字符串类,它提供了一系列方便的方法来操作字符串。其中,substring()方法是一个非常常用的方法,可以用来获取字符串中的一部分内容,即子串。下面将介绍如何使用StringBuffer类的

Java中StringBuffer和StringBuilder怎么使用 Java中StringBuffer和StringBuilder怎么使用 Jun 02, 2023 pm 03:01 PM

当对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类。和String类不同的是,StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象。StringBuffer:在使用StringBuffer类时,每次都会对StringBuffer对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用StringBuffer。StringBuilder:StringBuilder类在Java5中被提出,它和S

使用StringBuffer类的reverse()方法反转字符串中的字符顺序 使用StringBuffer类的reverse()方法反转字符串中的字符顺序 Jul 26, 2023 pm 10:10 PM

使用StringBuffer类的reverse()方法反转字符串中的字符顺序在Java中,有多种方法可以反转字符串中的字符顺序。其中一个简单而高效的方法是使用StringBuffer类的reverse()方法。本文将介绍如何使用这个方法来实现字符串反转,并提供相关的代码示例。StringBuffer类是Java中用于处理字符串的可变类。与String类不同,

使用StringBuffer类的insert()方法在Java中向字符串中插入内容 使用StringBuffer类的insert()方法在Java中向字符串中插入内容 Jul 24, 2023 am 11:34 AM

使用StringBuffer类的insert()方法在Java中向字符串中插入内容在Java编程中,StringBuffer类是一个非常常用的字符串操作类。它提供了多种方法来修改字符串,其中insert()方法是一种非常方便用于向字符串中插入内容的方法。insert()方法的作用是在指定的位置插入一个字符、一个字符数组、一个字符串或者其他数据类型转化的字符串

See all articles