1.StringBuffer用法介绍:
构造方法:
* StringBuffer(): 构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。
* StringBuffer(int capacity):构造一个不带字符,但具有指定初始容量的字符串缓冲区。
* StringBuffer(String str):构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
成员方法:
* public int length():返回长度(字符数)实际值
* public int capacity():返回当前容量 理论值
改变功能:
*public StringBuffer append(String str)在字符串后增加内容
* public StringBuffer insert(int offset,String str)在指定位置处插入字符串
删除功能:
* public StringBuffer deleteCharAt(int index):删除指定位置的字符
* public StringBuffer delete(int start,int end):删除从指定位置开始到指定位置结束的内容
public StringBuffer replace(int start,int end,String str):用给定的字符串替换从指定位置开始到指定位置结束的数据
反转功能:
public StringBuffer reverse()
截取功能:
返回值类型是String类型,本身没有发生改变
* public String sub string(int start):从指定位置开始到末尾
* public String substring(int start,int end):从指定位置开始到指定位置结束
与String类型可以进行互相转换:
String to StringBuffer:
String s = “hello”;
StringBuffer sb = new StringBuffer(s);
StringBuffer to String:
String ss = new String(sb);
同时需要注意的是:
String类中并不包含例如反转字符串内容等功能,因此,为了简便实现类似功能,我们可以使用StringBuffer 中的相关功能与其进行转换后在进行功能实现。
2.String,StringBuffer,StringBuilder的区别?
A:String长度固定,StringBuffer和StringBuilder的长度可变。
B:StringBuffer线程安全,效率低。StringBuilder线程不安全,效率高。
C:StringBuffer适合多线程下在字符缓冲区进行大量操作的情况,而StringBuilder更适合在单线程下在字符缓冲区进行大量操作的情况。
D:运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
3.String最慢的原因:
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。以下面一段代码为例:
String str=”abc”;
System.out.println(str);
Str = str+ ”de”;
System.out.println(str);
如果运行这段代码会发现先输出“abc”,然后又输出“abcde”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
另外,有时候我们会这样对字符串进行赋值
String str="abc"+"de";
StringBuilder stringBuilder=new StringBuilder().append("abc").append("de");
System.out.println(str);
System.out.println(stringBuilder.toString());
这样输出结果也是“abcde”和“abcde”,但是String的速度却比StringBuilder的反应速度要快很多,这是因为第1行中的操作和
String str="abcde";
是完全一样的,所以会很快,而如果写成下面这种形式
String str1="abc";
String str2="de";
String str=str1+str2;
那么JVM就会像上面说的那样,不断的创建、回收对象来进行这个操作了。速度就会很慢。
参考Blog:
https://www.cnblogs.com/su-feng/p/6659064.html 对大大表示感谢~