Java基础:为什么需要用stringbuffer或者StringBuilder去拼接字符串——而不用string——以及stringbuffer的基本了解

Java基础:为什么需要用stringbuffer或者StringBuilder去拼接字符串——而不用string——以及stringbuffer的基本了解小知识,大挑战!本文正在参与「程序员必备小知识」创作活动 本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。 📖前言 简述 首先说运行速度,或者说是执行速度,在这方面运行速度快慢….

小知识,大挑战!本文正在参与「程序员必备小知识」创作活动

本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。

📖前言

心态好了,就没那么累了。心情好了,所见皆是明媚风景。

**`“一时解决不了的问题,那就利用这个契机,看清自己的局限性,对自己进行一场拨乱反正。”正如老话所说,一念放下,万般自在。如果你正被烦心事扰乱心神,不妨学会断舍离。断掉胡思乱想,社区垃圾情绪,离开负面能量。心态好了,就没那么累了。心情好了,所见皆是明媚风景。


简述

首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String

  1. String最慢的原因: String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。以下面一段代码为例:
  1. 而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多
  1. 在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的 如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

直接上代码

package com.test;

/** * * @Description: 为什么需要用stringbuffer或者StringBuilder去拼接字符串——而不用string——以及stringbuffer的基本了解 * 在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的 * 如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字, * 所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。 * 所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。 * * stringbuilder类的append方法是return this,而string类的方法都是return new String * * 因为string使用final char[] value数组存储字符串内容,每次修改是return new String返回一个新的字符串,需要重新生成一个字符串对象, * 申请内存空间,这花了时间,而stringbuilder类的value数组不是final的,是可变的,不需要重新生成新的对象,但是数组扩容其实也是换一个更大的数组罢了 * * @ClassName: Test.java * @author ChenYongJia * @Date 2019年6月26日 晚上20:23 * @Email chen87647213@163.com */
public class Test {

	public static void main(String[] args) {
		String str = "";
		StringBuffer sb = new StringBuffer();// 线程安全
		StringBuilder sbBuilder = new StringBuilder();// 线程不安全
		long start = 0L;
		long end = 0L;
		start = System.currentTimeMillis();
		for (int i = 0; i < 99999; i++) {// 进行十万次循环
			str = str + "我们来测试一下试试看看差异有多大!";
		}
		end = System.currentTimeMillis();
		System.out.println("使用string的时间是:" + (end - start) + "毫秒!");

		start = System.currentTimeMillis();
		for (int i = 0; i< 99999; i++) {// 进行十万次循环
			sb.append("我们来测试一下试试看看差异有多大!");
		}
		end = System.currentTimeMillis();
		System.out.println("使用StringBuffer的时间是:" + (end - start) + "毫秒!");

		start = System.currentTimeMillis();
		for (int i = 0; i < 99999; i++) {// 进行十万次循环
			sbBuilder.append("我们来测试一下试试看看差异有多大!");
		}
		end = System.currentTimeMillis();
		System.out.println("使用StringBuilder的时间是:" + (end - start) + "毫秒!");
	}

}

我们看执行结果最直观

在这里插入图片描述 String拼接了223秒,另外两个是毫秒级别,不用我多说了吧各位


总结

  • String:适用于少量的字符串操作的情况

  • StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

  • StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

  • stringbuilder类的append方法是return this,而string类的方法都是return new String

  • 因为string使用final char[] value数组存储字符串内容,每次修改是return new String返回一个新的字符串,需要重新生成一个字符串对象,申请内存空间,这花了时间,而stringbuilder类的value数组不是final的,是可变的,不需要重新生成新的对象,但是数组扩容其实也是换一个更大的数组罢了

最后感谢大家耐心观看完毕,原创不易,留个点赞收藏是您对我最大的鼓励!


🎉总结:

  • 更多参考精彩博文请看这里:《陈永佳的博客》

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!

今天的文章Java基础:为什么需要用stringbuffer或者StringBuilder去拼接字符串——而不用string——以及stringbuffer的基本了解分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/16922.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注