1.是一个不可被继承(final )的类。是一个容器
字符缓冲区就像一个String ,但是可以修改。在任何时间点,它可以包含一些特定的字符序列,但是可以通过某些方法调用来修改序列的长度和内容
在StringBuffer 中的方法 append(添加到末尾) insert(插入数据到指定的位置 )
2.实际上他就是一个数据容器(数组也是一个数据容器)
数组的特点:有一定的长度,数据的类型与数组定义的类型是一致的。最穷的容器,属性只有:长度,角标
StringBuffer() 的特点:长度是可以修改的,可以是任何类型的数据,注意:是将任意数据都转成字符串进行存储。所有的数据都会变成一个字符串
3.比较富有的容器:本身就提供了对容器里数据操作的各种方法。比如增删改查
4.字符串缓冲区的内部其实是由数组来存储的
数组本身是不可变的,在StringBuffer() 中可变数组长度的原理:当一个数组存满后,再新创建一个数组,长度是原数组的两倍,再把原数组的数据复制到新数组中,这就实现了数组长度的可变。
5.与数组最大的不同:数组可以单独操作每一个元素,每一个元素都是独立的。但是在字符缓冲区中,所有的存储元素都会被转化成字符串,而且最后拼成一个大的字符串(这其实也是他的局限性)
StringBuffer() 的使用:构造函数 /// 增 删 改 查
构造函数:
-
-
Constructor and Description StringBuffer()
构造一个没有字符的字符串缓冲区,初始容量为16个字符。
StringBuffer(CharSequence seq)
构造一个包含与指定的相同字符的字符串缓冲区
CharSequence
。StringBuffer(int capacity)
构造一个没有字符的字符串缓冲区和指定的初始容量。
StringBuffer(String str)
构造一个初始化为指定字符串内容的字符串缓冲区。
-
1.append(): 追加,在末尾添加
2.insert() : 插入,insert(offset,b);偏移量,插入的数据。数据是插入在偏移量之前
3.删除:delete(begain,end);删头不删尾 deleteCharAt(int x) ;删除指定位置的字符
其他的一些方法是和string 中的方法类似的。
讲一个:
-
-
StringBuffer
replace(int start, int end, String str)
用指定的String中的字符替换此序列的子字符串中的
String
。
-
含头不含尾
-
-
-
子串开始于指定
start
并延伸到字符索引end - 1
,或如果没有这样的字符存在的序列的结束。 第一子串中的字符被去除,然后指定String
被插入在start
。 (如果需要,此序列将被延长以容纳指定的字符串。)
-
-
关于String 的相关原理:
字符串在创建时用的就是字符缓冲区,字符串将数据整理完后toString(),数据就变成一个字符串了
String str= "a"+"b"+5;
//底层的代码
str= new StringBuffer().append("a").append("b").append("5").toString();
-
Java语言为字符串连接运算符(+)提供特殊支持,并为其他对象转换为字符串。 字符串连接是通过
StringBuilder
(或StringBuffer
)类及其append
方法实现的。 字符串转换是通过方法来实现toString
,由下式定义Object
和继承由在Java中的所有类。
练习:
将一个数组转化为字符串,输出的格式:[12,36,56,98]
//代码
package String;
/*
将一个数组转化为字符串,输出的格式:[12,36,56,98]
*/
public class StringBufferDeno {
public static void main(String[] args){
int[] nums = {12,36,56,98};
String str1 = toString1(nums);//调用方法
String str2= toString2(nums);//调用方法二
System.out.println("str1 = "+str1);
System.out.println("str2 = "+str2);
}
//方法一:使用字符串连接符号‘+’
private static String toString1(int[] nums){
String str="[";
for(int i=0;i<nums.length;i++){
if(i!=nums.length-1){
str+=nums[i]+",";
}
else{
str+=nums[i]+"]";
}
}
return str;
}
//方法二:在字符缓冲区中进行,更加节省空间
/*
使用StringBuffer 字符缓冲区的情景:不知数量的不同类型的数据需要存储,并且最后都转化为字符串的形式
*/
private static String toString2(int[] nums){
StringBuffer str= new StringBuffer("[");
for(int i=0;i<nums.length;i++){
if(i!=nums.length-1){
str.append(nums[i]+",");
}
else{
str.append(nums[i]+"]");
}
}
return str.toString();
}
}
总结 缓冲区的应用:无论什么类型的数据 ,多少数都不重要,只要最终存储变成字符串就可以使用StringBuffer 这个容器
!!StringBuilder() 和 StringBuffer() 的区别:
StringBuffer():是同步的,多线程访问安全
StringBuilder():是非同步的,单线程访问效率更高
StringBuffer() :是线程安全的。每个方法大都是同步的,多线程并发执行的时候是完全安全的,但是当单线程执行时,效率就会很低,因此在JDK1.5版本以后就出现了 StringBuilder(),但是在StringBuilder() 中的函数是不具备同步性的,因此用于缓冲区被单线程访问(这种情况十分普遍),此时 效率就会高很多,在使用中如果可以就尽量优先使用该类,因为在大多数时候都比StringBuffer() 要快。因此StringBuild() 被设计作为哦StringBuffer() 的一个简易替换