StringBuffer
是一个线程安全的可变的字符序列,提供了字符串缓冲区(里面存储的内容都是字符串数据)
构造方法
- public StringBuffer():默认缓冲区大小,初始容量16个字符 (默认缓冲区大小足够!)
- public StringBuffer(int capacity):指定固定大小的初始容量,构造一个字符串缓冲区
- public StringBuffer(String str):构造一个缓冲区大小,容量大小等于字符串长度+初始容量16
获取功能
- public int capacity():获取字符串缓冲区的容量大小!
- public int length():获取字符串缓冲区中的字符串长度!
代码如下
package CSDN_Test;
public class StringBufferDemo {
public static void main(String[] args) {
//两个类型不一样:接收的类型:StringBuffer 数据内容:String类型
//StringBuffer buffer = "hello" ;//Type mismatch: cannot convert from String to StringBuffer
//public StringBuffer():默认缓冲区大小,初始容量16个字符 (默认缓冲区大小足够!)
StringBuffer sb = new StringBuffer() ;
System.out.println(sb);
System.out.println(sb.capacity());//16
System.out.println(sb.length());//0
System.out.println("-----------------------");
//public StringBuffer(int capacity):指定固定大小的初始容量,构造一个字符串缓冲区
StringBuffer sb2 = new StringBuffer(50) ;
System.out.println(sb2);
System.out.println(sb2.capacity());//50
System.out.println(sb2.length());//0
System.out.println("-----------------------");
// public StringBuffer(String str)
StringBuffer sb3 = new StringBuffer("hello") ; //指定字符串内容的缓冲区
System.out.println(sb3);//hello
System.out.println(sb3.capacity());//21
System.out.println(sb3.length());//5
String s = "hello" ;
//StringBufffer sb4 = s; //两种类型不匹配
StringBuffer sb4 = new StringBuffer(s);
}
}
添加功能:
- append(boolean /int/String…)追加到末尾(末尾追加),可以追加 任何数据,返回值是它本身
- public StringBuffer insert(int offset,String str):在指定位置处添加指定的字符串(在指定位置处的前面插入数据)
package CSDN_Test;
public class StringBufferDemo2 {
public static void main(String[] args) {
//创建一个字符串缓冲区大小
StringBuffer sb = new StringBuffer() ;
//System.out.println(sb.append("hello"));
//System.out.println(sb.append(true));
//System.out.println(sb.append('a'));
sb.append("hello").append(true).append('a').append("world") ;
System.out.println(sb);//hellotrueaworld
System.out.println("---------------------------");
sb.insert(5, "javaee") ;
System.out.println(sb);//hellojavaeetrueaworld
}
}
删除功能:
- public StringBuffer deleteCharAt(int index)删除指定索引处的字符,返回缓冲区本身 (推荐)
- public StringBuffer delete(int start, int end)删除从指定位置开始到指定位置结束的字符(包前不包后)end-1处
package CSDN_Test;
public class StringBufferDemo3 {
public static void main(String[] args) {
//创建一个字符串缓冲区大小
StringBuffer sb = new StringBuffer() ;
//追加
sb.append("hello") ;
sb.append("world") ;
sb.append("Javaee") ;
System.out.println(sb);//helloworldJavaee
//需求:删除第一个l字符
//sb.deleteCharAt(2) ;
//System.out.println(sb);
//需求:删除第二个l字符
//sb.deleteCharAt(2);
//System.out.println(sb);
System.out.println("-----------------------------");
//public StringBuffer delete(int start, int end)
sb.delete(5, 9) ; //包前不包后
System.out.println(sb);//hellodJavaee
sb.delete(5, sb.length()) ;
System.out.println(sb);//hello
}
}
替换功能以及反转功能
-
public StringBuffer replace(int start ,int end, String str)从指定位置开始到指定位置结束(end-1处)位置的字符使用新的str字符串替换掉
-
public StringBuffer reverse() :将字符串缓冲区的字符串进行反转
package CSDN_Test;
public class StringBufferDemo4 {
public static void main(String[] args) {
//构造一个缓冲区大小 (一般情况都是一个字符数组/字节数组)
StringBuffer sb = new StringBuffer() ;
//追加内容
sb.append("hello") ;
sb.append("world") ;
sb.append("JavaEE") ;
// public StringBuffer replace(int start ,int end, String str)
sb.replace(5, 10, "节日快乐") ;
System.out.println(sb);//hello节日快乐JavaEE
System.out.println("--------------------");
System.out.println(sb.reverse()) ; //将缓冲区中的字符串进行逆序!---EEavaJ乐快日节olleh
//键盘录入一个字符串:将字符串反转
//方式1:使用空串拼接 (逆序)
//方式2:创建一个StringBuffer对象--->利用reverse()方法反转
//将StringBuffer--->String :toString()
}
}
截取功能
- public String substring(int start):从指定位置默认截取到末尾
- public String substring(int start,int end)从指定位置截取到指定位置(end-1)处结束
package CSDN_Test;
public class StringBufferDemo5 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer() ;
sb.append("hello").append("world") ;
System.out.println(sb);//helloworld
//public String substring(int start):从指定位置默认截取到末尾
//String s = sb.substring(5) ;
//System.out.println(s);
//System.out.println(sb);
// public String substring(int start,int end)
String s = sb.substring(5, 10) ;
System.out.println(s);//world 包前不包后
}
}
StringBuffer面试题
1)String,StringBuffer,StringBuilder的区别?
- String : 字符串是一个常量,而且是不可变的字符序列;一旦被赋值,其值不能被更改(地址值)
String s = “abc”;
s = “abcd” ; - StringBuffer:是一个可变的字符序列,缓冲区中可以无限追加任何内容 “字符串”;线程安全的类---->多线程程序中会使用安全的类---->同步的---->执行效率低(内存角度)
- StringBuilder:和StringBuffer具有兼容的API,单线程程序中:StringBuilder去替代StringBuffer;是一个线程不安全的类----->不同步的----->执行效率高! (内存角度)
String类型是一个特殊的引用类型,String类型作为形式参数,形参的改变不会影响实际参数和基本类型作为形式参数的效果一样!
StringBuffer/StringBuilder作为形式参数,形参的改变会直接影响实际参数!引用类型都空间值(地址值传递),但是String是最特殊的!
2)StringBuffer和数组的区别?
- 共同点都"容器"
- 存储类型
StringBuffer:里面存储从字符串内容
StringBuffer sb = new StringBuffer() ;
sb.append(“hello”).append(true) …;
数组:只能存储同一种类型的元素
数组:不仅仅可以存储基本类型,还可以存储引用类型(但是元素的类型一致)
对象数组:专门存储对象
Student[] students = new Student[5] ; //引用类型:存储5个学生
int[] arr = new int[3] ; //基本类型 - 长度的区别:
StringBuffer获取字符串长度:length()
数组中获取数组的长度:length属性!
字符串的两种反转方式
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//录入
System.out.println("请您输入一个字符串内容:");
String line = sc.nextLine() ;
String result = reverse(line) ;
System.out.println("result:"+result);
System.out.println("-------------------------------");
String result2 = reverse2(line) ;
System.out.println("result2:"+result2);
}
//方式2:
public static String reverse2(String s) {
//构造一个缓冲区
//利用无参+append(String str)
/*StringBuffer sb = new StringBuffer() ;
sb.append(s) ;*/
//有参构造方法
//StringBuffer sb = new StringBuffer(s) ;
//将StringBuffer中的字符序列反转
//return sb.reverse().toString() ;
//一步走:
return new StringBuffer(s).reverse().toString() ;
}
//方式1:
public static String reverse(String s) {
//定义一个空串
String result = "" ;
//将s转换成字符数组
char[] chs = s.toCharArray() ;
for(int x = chs.length-1 ; x >=0 ; x --) {
result += chs[x] ;
}
return result ;
}