StringBuffer类
在java.lang中,不用导包
由于字符串是常量,因此一旦创建,其内容和长度是不可改变的。如果需要对一个字符串进行修改,则只能创建新的字符串。为了便于对字符串的修改,在JDK中提供了一个StringBuffer类(也称字符串缓冲区)。StringBuffer类和String类最大的区别在于它的内容和长度是可以改变的。
不能像String那样用加号连接
每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。
构造方法
StringBuffer():构造一个其中不带字符的字符串缓冲区,其初始容量为16字符。
StringBuffer(int capacity):构造一个不带字符,但具有指定初始容量的字符串缓冲区。
- StringBuffer(String str):构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
public static void main(String[] args) {
StringBuffer sb=new StringBuffer();
System.out.println(sb.length()); //容器中的字符个数,实际值
System.out.println(sb.capacity());//容器的初始容量,理论值
StringBuffer sb2=new StringBuffer(10);
System.out.println(sb2.length());
System.out.println(sb2.capacity());
StringBuffer sb3=new StringBuffer("eaglezsx");
System.out.println(sb3.length());
System.out.println(sb3.capacity());
}
运行结果为
0
16
0
10
8
24
添加功能
- StringBuffer append(String str):append方法有很多重载,可以将任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身。
- StringBuffer insert(int offset,String str):insert方法也有很多重载,在指定位置添加任意类型数据。
public static void main(String[] args) {
StringBuffer sb=new StringBuffer();
StringBuffer sb2=sb.append(false);
StringBuffer sb3=sb.append("eaglezsx");
System.out.println(sb);
System.out.println(sb2);
System.out.println(sb3);
}
运行结果为
falseeaglezsx
falseeaglezsx
falseeaglezsx
StringBuffer是字符串缓冲区,当new的时候在堆内存创建了一个对象,当调用append方法时,不会再创建对象,而是不断的向原缓冲区添加字符。这三个变量指向的是同一个对象。
public static void main(String[] args) {
StringBuffer sb=new StringBuffer("abcd");
sb.insert(3, "A");
System.out.println(sb);
}
运行结果为
abcAd
删除功能
StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
StringBuffer delete(int start,int end):删除从指定位置开始到指定位置结束的内容,并返回本身。
public static void main(String[] args) { StringBuffer sb=new StringBuffer("abcdef"); sb.deleteCharAt(2); System.out.println(sb); }
运行结果为
abdef
public static void main(String[] args) { StringBuffer sb=new StringBuffer("abcdef"); sb.delete(2,4); //包含头,不包含尾 System.out.println(sb); }
运行结果为
abef
清空缓冲区
sb.delete(0,sb.length());
替换和反转功能
StringBuffer replace(int start,int end,String str):从start开始到end用str替换
StringBuffer reverse():字符串反转
public static void main(String[] args) {
StringBuffer sb=new StringBuffer("aaaa");
sb.replace(1, 3, "b");//包含头,不包含尾
System.out.println(sb);
}
运行结果为
aba
public static void main(String[] args) {
StringBuffer sb=new StringBuffer("eagle");
sb.reverse();
System.out.println(sb);
}
运行结果为
elgae
截取功能
- String substring(int start):从指定位置截取到末尾
String substring(int start,int end):截取从指定位置开始到结束位置,包括开始位置,不包括结束位置
public static void main(String[] args) { StringBuffer sb = new StringBuffer("eagle"); String str = sb.substring(2); String str2=sb.substring(2, 3); System.out.println(str); System.out.println(str2); }
运行结果为
gle
g
String和StringBuffer之间的转换
- String—>StringBuffer
- 通过构造方法
- 通过append方法
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("eagle");
StringBuffer sb2=new StringBuffer();
sb2.append("eagle");
}
- StringBuffer—>String
- 通过构造方法
- 通过toString()方法
- 通过subSting(0,length)
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("eagle");
String s1=new String(sb);
String s2=sb.toString();
String s3=sb.substring(0,sb.length());
}
StringBuffer和StringBuilder的区别
StringBuffer是JDK1.0版本的,是线程安全的,效率低。
StringBuilder是JDK1.5版本的,是线程不安全的,效率高。
String是一个不可变的字符序列。
StringBuffer和StringBuilder是可变的字符序列。
String和StringBuffer分别作为参数传递
基本数据类型的传递,不改变其值。
引用数据类型的传递,改变其值。
String类虽然是引用数据类型,但是他当做参数传递时和基本数据类型是一样的。
public static void main(String[] args) {
String s="eagle";
System.out.println(s);
change(s);
System.out.println(s);
System.out.println("--------------------------");
StringBuffer sb=new StringBuffer();
sb.append("eagle");
System.out.println(sb);
change(sb);
System.out.println(sb);
}
private static void change(StringBuffer sb) {
sb.append("zsx");
}
private static void change(String s) {
s+="zsx";
}
运行结果为
eagle
eagle
--------------------------
eagle
eaglezsx