文档章节

浅谈StringBuffer

o
 osc_w9s1w4o0
发布于 2019/04/01 15:36
字数 1968
阅读 9
收藏 0

精选30+云产品,助力企业轻松上云!>>>

StringBuffer,由名字可以看出,是一个String的缓冲区,也就是说一个类似于String的字符串缓冲区,和String不同的是,它可以被修改,而且是线程安全的。StringBuffer在任意时刻都有一个特定的字符串序列,不过这个序列和它的长度可以通过一些函数调用进行修改。它的结构层次如下图:

 

StringBuffer是线程安全的,因此如果有几个线程同时操作StringBuffer,对它来说也只是一个操作序列,所有操作串行发生。

每一个StringBuffer都有一个容量,如果内容的大小不超过容量,StringBuffer就不会分配更大容量的缓冲区;如果需要更大的容量,StringBuffer会自动增加容量。和StringBuffer类似的有StringBuilder,两者之间的操作相同,不过StringBuilder不是线程安全的。虽然如此,由于StringBuilder没有同步,所以它的速度更快一些。

如上截图,StringBuffer是一个final 类【不能被继承,没有子类】,且继承了抽象类ABstracrStringBuilder并且实现了java io接口

注意看一些类文件上面的标注,since jdk1.0 就有StringBuffer, 而在网上要注解,在jdk5,该类得到一个补充,也就是常用来比较的StringBuilder,单个线程,速度更快,不执行同步,建议优先使用StringBuilder 巴拉巴拉

 

 

        StringBuffer sb1 = new StringBuffer();
        sb1.append('a');
        sb1.append(11);
        System.out.println(sb1.toString());


        StringBuffer sb2 = new StringBuffer("a11");
        System.out.println(sb2.toString());



        //StringBuffer和String属于不同的类型,也不能直接进行强制类型转换,下面的代码都是错误的
        sb2 ="222";
        sb2 =(StringBuffer)"333";


        //tringBuffer对象和String对象之间的互转的代码如下
        String s = "a11";
        StringBuffer sb11 = new StringBuffer("a11");
        StringBuffer sb12 = new StringBuffer(s); //String转换为StringBuffer
        String s1 = sb1.toString(); //StringBuffer转换为String

  

2、StringBuffer的常用方法
StringBuffer类中的方法主要偏重于对于字符串的变化,例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。

a、append方法
public StringBuffer append(boolean b)

该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer对象的内容也发生改变,例如:

StringBuffer sb = new StringBuffer(“abc”);

sb.append(true);

则对象sb的值将变成”abctrue”。

使用该方法进行字符串的连接,将比String更加节约内容,例如应用于数据库SQL语句的连接,例如:

StringBuffer sb = new StringBuffer();

String user = “test”;

String pwd = “123”;

sb.append(“select * from userInfo where username=“)

.append(user)

.append(“ and pwd=”)

.append(pwd);

这样对象sb的值就是字符串“select * from userInfo where username=test and pwd=123”。

b、deleteCharAt方法
public StringBuffer deleteCharAt(int index)

该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。例如:

StringBuffer sb = new StringBuffer(“Test”);

sb. deleteCharAt(1);

该代码的作用删除字符串对象sb中索引值为1的字符,也就是删除第二个字符,剩余的内容组成一个新的字符串。所以对象sb的值变为”Tst”。

还存在一个功能类似的delete方法:

public StringBuffer delete(int start,int end)

该方法的作用是删除指定区间以内的所有字符,包含start,不包含end索引值的区间。例如:

StringBuffer sb = new StringBuffer(“TestString”);

sb. delete (1,4);

该代码的作用是删除索引值1(包括)到索引值4(不包括)之间的所有字符,剩余的字符形成新的字符串。则对象sb的值是”TString”。

c、insert方法
public StringBuffer insert(int offset, boolean b)

该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。例如:

StringBuffer sb = new StringBuffer(“TestString”);

sb.insert(4,false);

该示例代码的作用是在对象sb的索引值4的位置插入false值,形成新的字符串,则执行以后对象sb的值是”TestfalseString”。

d、reverse方法
public StringBuffer reverse()

该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:

StringBuffer sb = new StringBuffer(“abc”);

sb.reverse();

经过反转以后,对象sb中的内容将变为”cba”。

e、setCharAt方法
public void setCharAt(int index, char ch)

该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。例如:

StringBuffer sb = new StringBuffer(“abc”);

sb.setCharAt(1,’D’);

则对象sb的值将变成”aDc”。

f、trimToSize方法
public void trimToSize()

该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。

g、toString()方法
该方法是将StringBuffer对象转化为字符串类型。
总之,在实际使用时,String和StringBuffer各有优势和不足,可以根据具体的使用环境,选择对应的类型进行使用。

 

3、常用方法

(1)构造函数

StringBuffer有四个构造函数:

StringBuffer() value内容为空,并设置容量为16个字节;
StringBuffer(CharSequece seq)  使用seq初始化,容量在此基础上加16;
StringBuffer(int capacity) 设置特定容量;
StringBuffer(String str)  使用str初始化,容量str大小的基础上加16;
(2)append方法

由于继承了Appendable接口,所以要实现append方法,StringBuffer类对几乎所有的基本类型都重载了append方法:

append(boolean b)
append(char c)
append(char[] str)
append(char[] str,int offset,int len)
append(CharSequence s)
append(CharSequence s,int start,int end)
append(double d)
append(float f)
append(int i)
append(long lng)
append(Object obj)
append(String str)
append(StringBuffer sb)
(3)insert方法

insert方法可以控制插入的起始位置,也几乎对所有的基本类型都重载了insert方法:

insert(int offser,boolean b)
insert(int offset,char c)
insert(int offset,char[] str)
insert(int index,char[] str,int offset,int len)
insert(int dsfOffset,CharSequence s)
insert(int dsfOffset,CharSequence s,int start,int end)
insert(int offset,double d)
insert(int offset,float f)
insert(int offset,int i)
insert(int offset,long l)
insert(int offset,Object obj)
insert(int offset,String str)
(4)其它会改变内容的方法

上面的那些方法会增加StringBuffer的内容,还有一些方法可以改变StringBuffer的内容:

StringBuffer delete(int start,int end) 删除从start到end(不包含)之间的内容;
StringBuffer deleteCharAt(int index) 删除index位置的字符;
StringBuffer replace(int start,int end,String str) 用str中的字符替换value中从start到end位置的子序列;
StringBuffer reverse() 反转;
void setCharAt(int index,char ch) 使用ch替换位置index处的字符;
void setLength(int newLength) 可能会改变内容(添加'\0');
(5)其它常用方法

下面这些方法不会改变内容:

int capacity() 返回value的大小即容量;
int length() 返回内容的大小,即count;
char charAt(int index) 返回位置index处的字符;
void ensureCapacity(int minimumCapacity) 确保容量至少是minimumCapacity;
void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin) 返回srcBegin到srcEnd的字符到dst;
int indexOf(String str) 返回str第一次出现的位置;
int indexOf(String str,int fromIndex) 返回从fromIndex开始str第一次出现的位置;
int lastIndexOf(String str) 返回str最后出现的位置;
int lastIndexOf(String str,int fromIndex) 返回从fromIndex开始最后一次出现str的位置;
CharSequence subSequence(int start,int end) 返回字符子序列;
String substring(int start) 返回子串;
String substring(int start,int end) 返回子串;
String toString() 返回value形成的字符串;
void trimToSize() 缩小value的容量到真实内容大小;
4、与String和StringBuilder的区别
三者都是处理字符串常用的类,不同在于:
速度上:String<StringBuffer<StringBuilder;
安全上:StringBuffer线程安全,StringBuilder线程不安全;
原因在于,String的每次改变都会涉及到字符数组的复制,而StringBuffer和StringBuilder直接在字符数组上改变;同时,StringBuffer是线程安全的,而StringBuilder线程不安全,没有StringBuffer的同步,所以StringBuilder快于StringBuffer。

总结:
如果对字符串的改变少,使用String;
如果对字符串修改的较多,需要线程安全就用StringBuffer,不需要就使用StringBuilder。

 

  

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
String,StringBuilder和StringBuffer类

今天看了一会儿关于String的一类的书,大概了解了String,StringBuilder和Stringuffer的区别。下面我就来浅谈一下关于这三部分的差别。 public class Test { int loopCount = 10000; // 执行...

laohng1995
2016/04/07
51
0
java面试题库

redis的三种内存淘汰策略,并举例说明一种使用场景 string、stringbuffer、stringbuilder的区别 tcp、http、https的区别 sleep和wait的区别 举例说明三个Linux的指令和使用场景 简述同步安全...

Grittan
2018/12/29
0
0
String,StringBuffer,StringBuilder浅谈

String 字符串变量 StringBuffer 线程安全的字符串处理类 StringBuilder 线程不安全的字符串处理类 先对比一下执行的效率: 对比结果是: StringBuilder>StringBuffer>String 注意:这里说一...

牧夫好学生
2018/03/17
0
0
浅谈如何减少GC的次数

GC会stop the world。会暂停程序的执行,带来延迟的代价。所以在开发中,我们不希望GC的次数过多。 本文将讨论如何在开发中改善各种细节,从而减少GC的次数。 (1)对象不用时最好显式置为 Nu...

浮躁的码农
2019/03/26
34
0
java基础---浅谈Java中的String、StringBuilder以及StringBuffer

浅谈Java中的String、StringBuilder以及StringBuffer 一.你了解String类吗? 想要了解一个类,最好的办法就是看这个类的实现源代码,String类的实现在 jdkxxxxxxsrcjavalangString.java 文件...

android-key
2016/12/11
11
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringCloud- 第六篇 Hystrix参数配置(三)

1:概述 Hystrix使用Archaius作为配置属性的默认实现。官方配置文档: https://github.com/Netflix/Hystrix/wiki/Configuration 每个属性有四个优先级,依次增大: 1:代码的全局默认值 2:动...

osc_7z601p6x
30分钟前
5
0
SpringBoot2 整合JTA组件,多数据源事务管理

本文源码:GitHub·点这里 || GitEE·点这里 一、JTA组件简介 1、JTA基本概念 JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个网络计算机资源上访问并且更新...

osc_sju4uxml
31分钟前
11
0
Springboot + Vue + shiro 实现前后端分离、权限控制

本文总结自实习中对项目的重构。原先项目采用Springboot+freemarker模版,开发过程中觉得前端逻辑写的实在恶心,后端Controller层还必须返回Freemarker模版的ModelAndView,逐渐有了前后端分...

osc_lbt7zo1x
33分钟前
19
0
docker-compose部署配置jenkins

docker-compose部署配置jenkins 一、docker-compose文件 version: '3.1'services: jenkins: image: jenkins/jenkins:lts volumes: - /data/jenkins/:/var/jenkins_home ......

osc_4p2c0ecc
35分钟前
22
0
第五周

1、查找/etc目录下大于1M且类型为普通文件的所有文件 2、打包/etc/目录下面所有conf结尾的文件,压缩包名称为当天的时间,并拷贝到/usr/local/src目录备份。 3、利用sed 取出ifconfig命令中本...

osc_hxm151is
36分钟前
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部