博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈StringBuffer
阅读量:7060 次
发布时间:2019-06-28

本文共 5242 字,大约阅读时间需要 17 分钟。

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

 

  

 

转载于:https://www.cnblogs.com/qianjinyan/p/10636739.html

你可能感兴趣的文章
linux Posix 信号量 二
查看>>
【leetcode】 Letter Combinations of a Phone Number(middle)
查看>>
poj 1061青蛙的约会
查看>>
Linux系统管理员的命令行工具箱目录
查看>>
去掉浏览器的代理服务器
查看>>
【转】 JSONObject使用方法
查看>>
(多图) FIR数字滤波器的FPGA实现研究
查看>>
Simple Factory vs. Factory Method vs. Abstract Factory【简单工厂,工厂方法以及抽象工厂的比较】...
查看>>
Sublime Text 3 史上最性感的编辑器
查看>>
阻塞与死锁(一)——基础知识
查看>>
聚合索引(clustered index) / 非聚合索引(nonclustered index)
查看>>
Linux进程间通信——信号集函数
查看>>
[LeetCode] Set Matrix Zeroes 矩阵赋零
查看>>
(转)Babel-现在开始使用 ES6
查看>>
架设证书服务器 及 让IIS启用HTTPS服务(转)
查看>>
华为离职副总裁徐家骏:年薪千万的工作感悟
查看>>
zedboard上移植OPENCV库
查看>>
eclipse重构详解(转)
查看>>
错误:找不到类org.springframework.web.context.ContextLoaderListener
查看>>
高通网申
查看>>