------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
.StringBuffer:线程安全的可变字符序列
1、stringbuffer概述
1).StringBuffer是一个容器,可以装一些字符串。
它就类似于一个"容器"。里面装的是"字符串"。用它来盛装"字符串",对"字符串"进行 一系列的操作
2).它有容量和长度的概念;
3).StringBuffer和String的区别:
1).String的值是不可变的;
2).StringBuffer是容器,内部是可以改变的;
4).如果需要对一个字符串经常的修改,要考虑使用StringBuffer。因为String会产生多个的存储空间,这是一个效率比较低的方式。
5).StringBuffer和StringBuilder的区别:
1).StringBuffer是线程安全的。效率低;
2).StringBuilder是线程不安全的。效率高;
2、构造方法:
public StringBuffer() :构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符
public StringBuffer(int capacity):构造一个不带字符,但具有指定初始容量的字符串缓冲区
public StringBuffer(String str):构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
StringBuffer的容量和长度的概念
1.容量:可存储的最大长度;public int capacity()方法可以获取容量
2.长度:当前实际存储的字符的数量;public int length()返回长度(字符数)
3、成员方法:
StringBuffer的添加功能:
public StringBuffer append(String str):append()有很多其他的重载方法。可以接收★★★任何的基本数据类型★★★,并将这些类型的参数转换String存储到内部;
注意:由于返回的就是调用者的引用,所以,调用时,接不接收返回值都可以,效果一样的。
class Student{
public Student append(boolean b){
//做一些其他事情
return this;//哪个对象调用此方法,就返回哪个对象的引用;
}
}
public static void main(){
Student stu = new Student();
Student stu2 = stu.append(true);
System.out.println(stu == stu2);
}
public StringBuffer insert(int offset,String str):将字符串插入此字符序列中。将字符串str插入到offset位置。原offset位置上的字符后移。
参数:offset - 偏移量。str - 一个 string。
StringBuffer类的删除方法;
public StringBuffer deleteCharAt(int index):删除index位置上的字符
public StringBuffer delete(int start,int end):删除start索引位置到 end - 1 的索引位置上的所有字符
StringBuffer类的替换和反转:
public StringBuffer replace(int start,int end,String str):将start和(end - 1处)之间的字符替换为参数str
大家回顾String类的replace()方法,它们两个的区别:
1.String的replace()方法返回一个新字符串,原字符串没变;
2.StringBuffer的replace()方法改变的就是自己容器内部的字符序列。内部是发生了改变的。
public StringBuffer reverse()倒序更改其内的字符序列,其长度和对象地址值不发生改变。
StringBuffer类的截取功能:
public String substring(int start):从start开始到结尾。返回的是一个String。原内部的值是否会发生改变呢?没变
public String substring(int start,int end):截取从start到 end 处 的所有字符,原内部的值不发生改变。
4、String 和StringBuffer的相互转换
1).从String到StringBuffer
1.通过构造方法:
String str = "hello";
StringBuffer buf = new StringBuffer(str);
2.使用append方法
String str = "hello";
StringBuffer buf = new StringBuffer();
buf.append(str);
2).从StringBuffer到String:
1.StringBuffer的toString()方法:String str = buf.toString();
2.使用截取:String str = buf.substring(0);
5、打印StringBuffer,会调用其tostring方法,输出的是其内的字符序列。
6、把数组拼接成字符串
使用String进行拼接。弊端:在拼接过程中,会产生很多的字符串空间。
使用stringbuffer;循环拼接就可以。
for(int i = 0 ;i < arr.length ; i++){
if(i < arr.length - 1){
buf.append(arr[i]);
buf.append(",");
}else{
buf.append(arr[i]);
return buf.toString();//需要将StringBuffer转换为String
7、字符串反转
A:StringBuffer中有个反转的功能:reverse()
1).将字符串转换为StringBuffer:通过StringBuffer的构造方法;
2).调用reverse();
3).将StringBuffer再转换为字符串;
B:其它算法:
1.将字符串提取数组;
2.倒序遍历数组,将数组中每个字符存储到StringBuffer中;
3.将StringBuffer中的字符串取出;
C:数组倒序法:
1.将字符串提取数组;
2.将数组中第一个元;素和倒数第一个元素交换,第二个和倒数第二个交换,以此类推,
3.将字符数组转换为字符串
8、判断是否是对称字符串
算法一:
1.定义一个字符串,并转换为StringBuffer
2.将StringBuffer内的值反转;
3.转换为字符串并和原字符串比较,如果相同,则认为是"对称串"
算法二:
1.定义一个字符串,并转换为字符数组;
2.将字符数组中的第一个元素和倒数第一个元素比较,并依次比较第二位和倒数第二位,如果有一位不相同,就不是对称字符串:
String str = "abcba";
char[] charArray = str.toCharArray();
int len = charArray.length ;
boolean flag = true;//先假设是对称串;//使用一个boolean类型的变量做标记
for(int i = 0 ;i < len ; i++){
char c1 = charArray[i];
char c2 = charArray[charArray.length - 1 - i];
if(c1 != c2){
flag = false;//标记不是对称串;
break;
}
}
if(flag){
System.out.println("是对称串");
}else{
System.out.println("不是对称串");
}
9、StringBuffer和StringBuilder的区别:使用上来讲,两个方法是等价的。
1.StringBuffer是线程安全的:可以安全的被多个线程同时访问。效率低;
2.StringBuilder是线程不安全的。效率高;
10、StringBuffer和数组的区别:
1.StringBuffer内部也是使用的数组,但对于我们来说,这个数组是"可变长度的",我们不用关心"容量不够的情况"。
数组:长度是固定的。一旦确定长度后,后期不能更改了。
2.StringBuffer的append()方法可以接收任何类型的参数,电脑最终都转换为"字符"存储了
数组:定义什么类型的就只能存储什么类型;
11、String和StringBuffer分别作为方法的形参
String作为参数传递,传递的是地址值,方法内改变引用指向,不改变原来的字符串
StringBuffer作为参数传递,传递的也是地址值,但是方法内改变其内容,影响原来的内容。
public static void change1(String str){//str = 0x2233
str = "world";//str = 0x5566//改变的不是原来字符串中的内容,因为字符串是不可变的。
public static void change2(StringBuffer buf){//buf = 0x4444
buf.append("world");//这里更改的就是0x4444中的内容;//同String类不同,StringBuffer内部是可以被更改的。