上一期我们深入研究了String类的使用,那么StringBuffer它来了,它与String类有什么区别呢?请往下看
目录
4、在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容
1、StringBuffer的长度和内容都是可以发生改变的,String不可变
Class StringBuffer
查看API文档我们知道:
public final class StringBuffer extends Object implements Serializable, CharSequence
线程安全,可变的字符序列。 字符串缓冲区就像一个String ,但可以修改。 在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。
字符串缓冲区可以安全地被多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都按照与所涉及的各个线程所执行的方法调用顺序一致的顺序发生。
StringBuffer的主要
StringBuffer
是append
和insert
方法,它们被重载以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入到字符串缓冲区。append
方法总是在缓冲区的末尾添加这些字符;insert
方法将insert
添加到指定点。例如,如果
z
是指当前内容为"start"
的字符串缓冲区对象,那么方法调用z.append("le")
将使字符串缓冲区包含"startle"
,而z.insert(4, "le")
会将字符串缓冲区更改为包含"starlet"
。一般情况下,如果某人是指的一个实例
StringBuffer
,则sb.append(x)
具有相同的效果sb.insert(sb.length(), x)
。每当涉及源序列(例如从源序列追加或插入)的操作发生时,该类仅在执行操作的字符串缓冲器上进行同步,而不在源上。 请注意,虽然
StringBuffer
被设计为可以安全地从多个线程并发使用,但如果构造函数或append
或insert
操作被传递通过线程共享的源序列,则调用代码必须确保该操作具有一致且不变的视图在操作期间的源序列。 呼叫者通过使用不可变的源序列,或者不跨线程共享源序列,可以在呼叫期间持有锁来满足这一点。每个字符串缓冲区都有一个容量。 只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区数组。 如果内部缓冲区溢出,则会自动变大。
除非另有说明,否则将
null
参数传递给null
中的构造函数或方法将导致抛出NullPointerException 。从版本JDK 5开始,这个类别已经被一个等级类补充了,这个类被设计为使用一个线程StringBuilder 。
StringBuilder
应该使用StringBuilder
类,因为它支持所有相同的操作,但它更快,因为它不执行同步。
看完这么长一段文字,你是否看明白了什么?来看靓仔给你分析吧!
-
StringBuffer的特点
1、线程安全
什么是线程不安全呢?就是存在同步操作同一数据的行为,效率高,那什么是线程安全呢?就是线程安全的时候,没有同步操作,效率不高。
其实在实际的开发过程中,效率和安全一直都是很难平衡的事情,举一些生活中线程安全和不安全的例子:
线程安全的例子:银行的一些业务、医院取号(不同人同时取不可能取相同的号)、电影院售票(不同人同时买票不可能取一张座位的号)
线程不安全的例子:视频会员(一个会员多个用户同时登录),博客评论(不同人同时发表评论)
2、可变的字符序列
3、字符串缓冲器就像一个String,但是可以修改
4、在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容
总而言之StringBUffer就是一个线程安全的可变字符串
-
StringBuffer与String的区别
1、StringBuffer的长度和内容都是可以发生改变的,String不可变
2、Sting每创建一个新的字符串都会开辟一个新的内存空间
StringBuffer可以提前给出一个容量,可以进行字符串的拼接,而不会重新开辟
StringBuffer的构造方法
StringBuffer()
查看API文档我们知道:
public StringBuffer()
构造一个没有字符的字符串缓冲区,初始容量为16个字符。
那如何查看StringBuffer的容量呢?
参考代码:
public class StringBufferDemo1 {
public static void main(String[] args) {
//StringBuffer() 构造一个没有字符的字符串缓冲区,初始容量为16个字符。
StringBuffer sb1 = new StringBuffer();
//StringBuffer重写的toString()方法
System.out.println("sb1:" + sb1);
//查看StringBuffer的容量
int capacity = sb1.capacity();
System.out.println("StringBuffer的容量: " + capacity);
//查看StringBuffer中字符串的长度
int length = sb1.length();
System.out.println("StringBuffer中字符串的长度: " + length);
}
}
sb1:
StringBuffer的容量: 16
StringBuffer中字符串的长度: 0Process finished with exit code 0
StringBuffer(int capacity)
查看API文档我们知道:
public StringBuffer(int capacity)
构造一个没有字符的字符串缓冲区和指定的初始容量。
参数
capacity
- 初始容量。异常
NegativeArraySizeException
- 如果capacity
参数小于0
。
参考代码1:
public class StringBufferDemo1 {
public static void main(String[] args) {
//StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区和指定的初始容量。
StringBuffer sb2 = new StringBuffer(50);
//StringBuffer重写的toString()方法
System.out.println("sb2:" + sb2);
//查看StringBuffer的容量
int capacity2 = sb2.capacity();
System.out.println("StringBuffer2的容量: " + capacity2);
//查看StringBuffer2中字符串的长度
int length2 = sb2.length();
System.out.println("StringBuffer2中字符串的长度: " + length2);
}
}
sb2:
StringBuffer2的容量: 50
StringBuffer2中字符串的长度: 0Process finished with exit code 0
参考代码2:
public class StringBufferDemo1 {
public static void main(String[] args) {
//StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区和指定的初始容量。
StringBuffer sb3 = new StringBuffer(-2);
System.out.println("sb3"+ sb3);
//查看StringBuffer的容量
int capacity3 = sb3.capacity();
System.out.println("StringBuffer3的容量: " + capacity3);
//查看StringBuffer3中字符串的长度
int length3 = sb3.length();
System.out.println("StringBuffer3中字符串的长度: " + length3);
}
}
运行结果:
通过参考代码2我们可以看出抛出了一个应用程序尝试创建一个负数大小的数组异常NegativeArraySizeException
所以capacity
是>0的否则NegativeArraySizeException
StringBuffer(String str)
查看API文档我们知道:
public StringBuffer(String str)
构造一个初始化为指定字符串内容的字符串缓冲区。 字符串缓冲区的初始容量为
16
加上字符串参数的长度。参数
str
- 缓冲区的初始内容。
参考代码:
public class StringBufferDemo1 {
public static void main(String[] args) {
//StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。
//StringBuffer重写的toString()方法
StringBuffer sb3 = new StringBuffer("hello");
System.out.println("sb3" + sb3);
//查看StringBuffer的容量
int capacity3 = sb3.capacity();
System.out.println("StringBuffer3的容量为:" + capacity3);
//查看StringBuffer3中字符串的长度
int length3 = sb3.length();
System.out.println("StringBuffer3中字符串的长度为:" + length3);
}
}
sb3hello
StringBuffer3的容量为:21
StringBuffer3中字符串的长度为:5Process finished with exit code 0
至此StringBuffer类的构造方法介绍完毕