Java中StringBuilder和StringBuffer用法以及区别

玉面公主
• 阅读 337

Java是目前最为流行的编程语言之一,而字符串则是Java程序中不可避免的部分。在字符串的处理中有两个类:StringBuilder和StringBuffer,这两个类都实现了对可变字符串的操作,在一定程度上可以替代String的功能。但它们之间也存在一些区别,下面我们就来详细介绍一下它们的用法和区别。

一、StringBuilder和StringBuffer的基础知识

StringBuilder和StringBuffer都是Java中对可变字符串的处理的类。Java中的字符串都是不可变的,即它们一旦创建就不能被改变,所有对字符串的操作都会生成一个新的字符串对象。这样,当我们需要对字符串进行频繁操作时就会带来很大的效率问题。

那么,StringBuilder和StringBuffer的作用就在于,它们提供了对字符串的可变操作,可以避免生成大量的字符串对象,提高了程序效率。

StringBuilder和StringBuffer的基本用法差不多,二者都有以下方法:

append:在字符串末尾添加内容
insert:在指定位置插入内容
delete:删除指定位置的字符
deleteCharAt:删除指定位置的字符
replace:替换指定位置的字符
substring:截取子串
indexOf:查找指定字符串位置
lastIndexOf:查找最后一次出现的指定字符串位置
length:获取当前字符串长度
setLength:设置字符串长度

二、StringBuilder和StringBuffer的区别

虽然StringBuilder和StringBuffer功能相似,但在使用中还是有一些区别的。下面我们来具体看一下。

1.线程安全

StringBuilder是非线程安全的,而StringBuffer是线程安全的。它们在实现上有所不同。

StringBuffer所有的方法都加了synchronized关键字修饰,保证了多个线程同时访问StringBuffer时不会产生数据的安全问题。而StringBuilder没有加synchronized关键字修饰,因此很可能在多线程的环境下会出现数据的竞争和不相干的结果。

2.效率

考虑到线程安全机制会带来额外的开销,StringBuffer的执行效率比StringBuilder要低。特别是当需要进行频繁的字符串操作时,使用StringBuilder会更加高效。

3.容量增长

StringBuilder和StringBuffer在扩充容量(即添加字符超过原来设定的长度时)的方法上也有所不同。

StringBuffer在容量不足以附加新内容时,会自动扩展容量的大小。默认情况下,容量会增加原来的2倍+2,例如:原来的容量为16,当容量不够时,则将容量扩充为34。

StringBuilder在容量不足以附加新内容时,会按照一定的规则(4个字符扩容一次)增容量,直到容量足够为止。

容量增长的方式不同,导致了StringBuilder比StringBuffer要稍微快一些。

三、示例代码

下面我们来通过一些实例来看一下StringBuilder和StringBuffer的用法以及效率差异。

首先是一个使用StringBuilder的示例:

long startTime = System.currentTimeMillis();

StringBuilder stringBuilder = new StringBuilder();

for (int i = 0; i < 100000; i++) {
  stringBuilder.append(i);
}

String result = stringBuilder.toString();

long endTime = System.currentTimeMillis();

System.out.println("time: " + (endTime - startTime) + "ms");

这个程序会生成一个长度为100000的字符串。我们可以分别测试使用StringBuilder和StringBuffer时的字符串生成速度,代码如下:

long startTime = System.currentTimeMillis();

StringBuffer stringBuffer = new StringBuffer();

for (int i = 0; i < 100000; i++) {
  stringBuffer.append(i);
}

String result = stringBuffer.toString();

long endTime = System.currentTimeMillis();

System.out.println("time: " + (endTime - startTime) + "ms");

运行这两个程序,我们得到的时间分别为:

使用StringBuilder:time: 3ms
使用StringBuffer:time: 4ms

从结果可以看出,使用StringBuilder所需时间比使用StringBuffer要少,效率也更高。

四、总结

在Java中,处理字符串需要用到String、StringBuilder和StringBuffer。尽管使用上都很容易,但大家应该从上述细节中清楚地知道其中的区别。如果在单线程的情况下,建议使用StringBuilder;在多线程的情况下,建议使用StringBuffer。

当然,在实际开发中,可能会遇到使用StringBuffer和StringBuilder之外的其他类的情况,因为它们可以通过缓存机制来避免字符串频繁创建的问题。但无论使用哪种方式,都应该注意字符串生成的效率问题,以便在程序运行时有更高的性能表现。

本文由mdnice多平台发布

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
String、StringBuffer、StringBuilder的区别
String字符串常量StringBuffer字符串变量(线程安全)StringBuilder字符串变量(非线程安全) 简要的说,String类型和StringBuffer类型的主要性能区别其实在于String是不可变的对象,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的String
Wesley13 Wesley13
3年前
java基础学习_常用类小结
看看下面的类,是否都熟悉,简要说明每个类主要是干什么呢?Object:是类层次结构的根类,所有类都直接或者间接的继承自该类。Scanner:获取键盘录入数据的类。String:针对字符串的常见操作的类。StringBuffer/StringBuilder:字符串缓冲区类,提高字符串的操
腾讯T3团队整理,持续更新中
Java基础1.JAVA中的几种数据类型是什么,各自占用多少字节。2.String类能被继承吗,为什么。3\.两个对象的hashCode()相同,则equals()也一定为true,对吗?4\.String属于基础的数据类型吗?5.Java中操作字符串都有哪些类?它们之间有什么区别?6.Java中IO流分为几种?7.BIO、NIO
Easter79 Easter79
3年前
String
一,String,StringBuffer,StringBuilder三者之间的关系三个类的关系:StringBuffer和StringBuilder都继承自AbstractStringBuilder这个类,而AbstractStringBuilder和String都继承自Object这个类(Object是所有java类的超类)
Easter79 Easter79
3年前
String Builder 源码分析
!(https://oscimg.oschina.net/oscnet/2af3de6213a842a08f7a8b1544c6ebf0.png)StringBuilder与StringBuffer区别StringBuilder可变字符串,线程不太安全,但效率高,推荐使用。StringBuffer可变字符串,线程安全,但效率
Easter79 Easter79
3年前
String的相关类和方法
String的相关类和方法一、String,StringBuilder,StringBuffer三者的区别这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面1、运行速度:StringBuilderStringBufferStringString为字符串常量,而StringBuilder和StringBuffe
Wesley13 Wesley13
3年前
Java深究之String、StringBuffer、StringBuilder的区别
       在Java学习中,String、StringBuffer、StringBuilder三者是很重要的,在编写代码中经常使用到他们,那么深入的了解他们的异同是非常重要的,接下里我们详细剖析下这三个的异同之处_首先总结下这三者的区别:_1.基本区别String的对象不可变,StringBuffer和StringBuild
Stella981 Stella981
3年前
BATJ的常见java面试题
JAVA基础1.JAVA中的几种基本数据类型是什么,各自占用多少字节。2.String类能被继承吗,为什么。不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。3.String,Stringbuffer,StringBuilder的区别。String字符串常量StringBuffer
Stella981 Stella981
3年前
20165305 苏振龙《Java程序设计》第六周学习总结
第八章知识点熟练掌握String类的常用方法。掌握String类的和StringBuffer类的不同,以及二者之间的联系。使用StringTokenizer,Scannner类分析字符串,获取字符串中被分隔符分隔的单词。掌握Date类和Calendar类获取时间和日期的用法。如果需要处理特别大的整数,使用BigInteger类。当需要
可莉 可莉
3年前
20165305 苏振龙《Java程序设计》第六周学习总结
第八章知识点熟练掌握String类的常用方法。掌握String类的和StringBuffer类的不同,以及二者之间的联系。使用StringTokenizer,Scannner类分析字符串,获取字符串中被分隔符分隔的单词。掌握Date类和Calendar类获取时间和日期的用法。如果需要处理特别大的整数,使用BigInteger类。当需要
为什么idea建议使用“+”拼接字符串 | 京东云技术团队
前言各位小伙伴在字符串拼接时应该都见过下面这种提示:内容翻译:报告StringBuffer、StringBuilder或StringJoiner的任何用法,这些用法可以用单个java.lang.String串联来替换。使用字符串串联可以使代码更短、更简单。
玉面公主
玉面公主
Lv1
收起烦恼,挂起月亮,睡个好觉。
文章
5
粉丝
0
获赞
0