一.StringBuffer类
1.StringBuffer类的概述
StringBuffer称为字符串缓冲区变量,它主要是用来存储字符串的,它与String的区别就是它可以用来存储可变字符序列。主要就是为了解决String类的缺点,从而诞生的。例如:"Hello","World"两个字符串对象会存储在方法区中的字符串常量池中,如果"Hello"的字符长度要发生改变,那么就会在方法区中的字符串常量池中,再创建一个新的内存,那么就会势必导致空间的浪费,而StringBuffer类就不会方式这样的问题。从而解决了String类的缺点。
2.StringBuffer类的构造方法
通过官方的API文档,主要是jdk1.5版本的文档,可以知道它相关的构造方法。当然,在这里,我主要是学习了两个构造方法:
1. StringBuffer stringBuffer = new StringBuffer();
它默认的是创建了容量为16的可变字符串序列变量。
2. StringBuffer stringBuffer = new StringBuffer(int capability);
它指定的就是容量为capability的变量。
3. StringBuffer stringBuffer = new StringBuffer(字符串);
它构造的就是初始化字符串缓冲区变量值为指定的字符串。它的容量是字符串的长度加上16。
当然StringBuffer类中有capability()方法,它是返回的是StringBuffer类的容量。它和StringBuffer类的length()方法是有本质区别的。StringBuffer的capability()方法返回的值表示的是StringBuffer类的容量表示它最多可以装下多少字符,而StringBuffer类的length()方法返回的是它实际存在字符串缓冲区中的长度。
3.StringBuffer类的成员方法
3.1 添加功能
3.1.1 public StringBuffer append(任意类型数据):
这个方法可以用来往StringBuffer类中添加任意类型的数据,并返回的是StringBuffer本身。
验证它返回的是它本身的案例:
StringBuffer stringBuffer1 = new StringBuffer();
StringBuffer stringBuffer2 = stringBuffer.append("hello");
System.out.println(stringBuffer1);
System.out.println(stringBuffer2);
System.out.println(stringBuffer1 == stringBuffer2);
这个结果返回的是["hello"] ["hello"] true
所以对它可以采用链式编程。
例如:
第一种添加字符串的方式:一个一个的添加
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("hello");
stringBuffer.append("the");
stringBuffer.append("world");
第二种添加字符串的方式:链式编程
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("hello").append("the").append("world");
3.1.2 public StringBuffer insert(int offerset,任意类型的数据):
这个方法会在指定的位置上插入字符串。案例:
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("hello");
stringBuffer.append("the");
stringBuffer.append("world");
stringBuffer.insert(5,true);
System.out.println(stringBuffer);
3.2 StringBuffer的删除功能
3.2.1 public StringBuffer deleteCharAt(int index):
stringBuffer类删除指定位置的字符,并返回的是这个StringBuffer类的本身。例如:
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("hello");
stringBuffer.append("the");
stringBuffer.append("world");
stringBuffer.deleteCharAt(1);
3.2.2 public StringBuffer delete(int start,int end):
stringBuffer类删除从start位置开始到end位置结束的字符串,当然,它是包左不包右的。
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("hello");
stringBuffer.append("the");
stringBuffer.append("world");
stringBuffer.delete(5,10);
System.out.println(stringBuffer);
3.3 StringBuffer的反转功能
3.3.1 public StringBuffer reverse():会将StringBuffer字符串缓冲区变量里面的内容给反转.例子:
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("avaj爱我");
System.out.println(stringBuffer);
3.4 StringBuffer的替换功能
public StringBuffer replace(int start,int end,String str):会将StringBuffer字符串缓冲区变量里面的内容的起始位置到指定的终止位置给替换给相应的字符串变量。当然,这个索引是包左,不包右。当然,这个返回的是字符串缓冲区变量本身。例子:
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("hello the world");
stringBuffer.replace(5,10,"liujiang");
System.out.println(stringBuffer);
3.5 StringBuffer的截取功能
public String subString(int start):截取从指定的索引开始到末尾出的字符串。并返回字符串。
public String subString(int start,int end):截取从指定的索引开始到指定的索引结束的字符串。并返回字符串。例如:
class StringBufferTest{
public static void main(String[] args){
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("hello the world");
System.out.println(stringBuffer.subString(5));
System.out.println(stringBuffer.subString(5,10));
}
}
4.StringBuffer类的几个题目
4.1 StringBuffer类和String类的相互转换:
1.String类到StringBuffer类的方法:
class StringBufferTest{
public static void main(String[] args){
//String到StringBuffer类的方式一:
//构造方法
StringBuffer stringBuffer = new StringBuffer("Hello");
//利用StringBuffer类的成员方法
StringBuffer stringBuffer2 = new StringBuffer();
stringBuffer2.append("hello");
}
}
2.StringBuffer类到String类的方式:
class StringBufferTest{
public static void main(String[] args){
//第一种方式,利用String类的构造方法
String str = new String(new StringBuffer());
//第二种方式,利用StringBuffer类的成员方法
StringBuffer stringBuffer = new StringBuffer("hello");
String str2 = stringBuffer.toString();
}
}
4.2 将数组拼接成指定格式的字符串格式:
第一种方式:
class StringBufferTest{
public static void main(String[] args){
//第一种方式,利用String的方法
int[] arr = {1,2,3,4,5,6,7,8};
//遍历数组
String s = "[";
for(int i = 0;i < arr.length;i++){
if( i != arr.length - 1){
s = s + arr[i] + " ,";
} else {
s += arr[i];
}
}
s += "]";
}
}
第二种方式:
class StringBufferTest{
public static void main(String[] args){
int[] arr = {1,2,3,4,5,6,7,8};
StringBuffer stringBuffer = new StringBuffer("[");
for(int i = 0 ;i < arr.length;i++){
if(i != arr.length -1 ){
stringBuffer.append(arr[i] + " ,");
} else {
stringBuffer.append(arr[i] + "]");
}
}
}
}
4.3 字符串反转功能:
//第一种方式
class StringBufferTest{
public static void main(String[] args){
String str = "abcdef";
char[] chr = str.toCharArray();
String result ="";
for(int i = chr.length -1; i >=0;i--){
result += chr[i];
}
System.out.println(result);
}
}
// 第二种方式
class StringBufferTest{
public static void main(String[] args){
StringBuffer stringBuffer = new StringBuffer("ababa");
stringBuffer.reverse();
}
}
4.4 判断一个字符串是否是对称案例:
import java.util.Scanner;
class StringBufferTest{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String line = sc.nextLine();
System.out.println("这个字符串是否是对称字符串: " + isReverse(line));
}
public static boolean isReverse(String str){
boolean flag = false;
StringBuffer stringBuffer = new StringBuffer(str);
stringBuffer.reverse();
if(stringBuffer.toString().equals(str)){
flag = true;
}
return flag;
}
}
5.StringBuffer类的几个面试题
5.1 StringBuilder类的概述
StringBuilder类是兼容StringBuffer类的。但它是线程不安全的,也就是意味着数据不同步,效率比较高。适合于单线程的问题解决。
5.2 String,StringBuffer,StringBuilder类的区别
String类是长度不变的量,而StringBuffer类是可变的字符序列,是缓冲区字符串序列,它是线程安全的,意味着数据同步,效率低下。StringBuilder类是线程不安全的,数据不同步,效率比较高。
5.3 StringBuffer和数组的区别?
StringBuffer表示的是容器,它虽然可以存储任意类型的变量,但最终都是字符串。
而数组也是容器, 它只能用来存储同一种数据类型的数据。
5.4 StringBuffer和String类型作为形式参数的问题?(重点!!!!!!)