StringBuffer
一、StringBuffer:
public final class StringBuffer
字符串缓冲区可供多个线程使用。
线程安全(没有出现同步操作,数据是安全的,但效率低),可变的字符序列。
字符串缓冲区类似于String ,但可以进行修改。
( 一)、StringBuffer 的构造方法
1、StringBuffer()
public StringBuffer() 构造一个字符串缓冲区,其中没有字符,初始容量为16个字符。
2、StringBuffer (int capacity)
public StringBuffer(int capacity) 构造一个字符串缓冲区,其中没有字符和指定的初始容量。
3、stringBuffer(String str)
public StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。字符串缓冲区的初始容量是16加上字符串参数的长度。
StringBuffer的方法:
public int capacity()返回当前容量。容量是新插入可用的存储量,超过此值将重新分配。
public int length() 返回长度(字符数)。
public class StringBufferDemo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
System.out.println("sb的实际存储字符数:"+ sb.length());
System.out.println("sb的容量为:" + sb.capacity());
System.out.println("===============================");
//StringBuffer (int capacity)
StringBuffer sb2 = new StringBuffer(50);
System.out.println("sb2的实际存储字符数:"+ sb2.length());
System.out.println("sb2的容量为:" + sb2.capacity());
System.out.println("================================");
//stringBuffer(String str)
StringBuffer sb3 = new StringBuffer("laoshuaini");
System.out.println("sb3的实际存储字符数:"+ sb3.length());
System.out.println("sb3的容量为:" + sb3.capacity());//本身字符串长度加上初始化容量长度
System.out.println(sb3);
}
}
(二)、 添加功能
1、 public StringBuffer append(String str)
将指定的字符串追加到此字符序列。
2、 public StringBuffer insert(int offset,String str)
将字符串插入此字符序列。
public class StringBufferDemo2 {
public static void main(String[] args) {
//创建StingBuffer对象
StringBuffer sb = new StringBuffer("hello");
sb.append("world").append("Java");//链式编程
System.out.println(sb);
System.out.println("==============================");
//StringBuffer不仅可以增加String类型的,还可以增加char、int、long等类型
//但需注意,无论添加之前是什么类型,添加之后都是字符,最终组合成字符串
//就算是true,添加进StringBuffer中,输出后都是‘t’、‘r’、‘u’、‘e’四个字符组成的字符串
Demo demo = new Demo();
sb.append(demo);//添加的是引用数据类型类中toString()的结果
System.out.println(sb);
System.out.println("===============================");
//public StringBuffer insert(int offset,String str)
// 将字符串插入此字符序列。
StringBuffer sb3 = new StringBuffer("hello");
sb3.insert(3,"he");//String参数的字符按顺序插入到指定偏移量的此序列中,
// 向上移动最初位于该位置上方的任何字符,并将该序列的长度增加参数的长度。
System.out.println(sb3);
}
}
class Demo{
private String name;
public Demo() {
}
public Demo(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Demo{" +
"name='" + name + '\'' +
'}';
}
}
(三)、删除功能:
1、 public StringBuffer deleteCharAt(int index)
按此顺序删除指定位置的char 。
2、 public StringBuffer delete(int start,int end)
删除此序列的子字符串中的字符。 子字符串从指定的start开始,
如果不存在这样的字符,则扩展到索引end - 1处的字符或序列的末尾。 如果start等于end ,则不进行任何更改。
异常:StringIndexOutOfBoundsException -
如果 start为负数,大于 length() ,或大于 end 。
public class StringBufferDemo3 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("woaidashuju");
System.out.println(sb);
System.out.println("sb的实际存储字符的个数:" + sb.length());
System.out.println("======删除字符后============");
// sb.deleteCharAt(4);
// System.out.println(sb);
// System.out.println("sb实际存储字符个数:"+ sb.length());
System.out.println("======指定位置删除============");
sb.delete(3,5);
System.out.println(sb); //删除数为(3,5]内字符
}
}
(四)、 替换功能
public StringBuffer replace(int start,int end,String str)
使用指定的String的字符替换此序列的子字符串中的字符。
子字符串从指定的start开始,并且如果不存在这样的字符,则扩展到索引end - 1处的字符或序列的末尾。
首先删除子字符串中的字符,然后在String插入指定的start 。
(如果需要,将延长此序列以容纳指定的字符串。)
public class StringBufferDemo4 {
public static void main(String[] args) {
//创建一个StringBuffer对象
StringBuffer sb = new StringBuffer("hellowol");
System.out.println(sb);
System.out.println("=====指定位置替换字符==============");
// sb.replace(2,6,"wove");// 从[2,6)开始替换,含头不含尾
// System.out.println(sb);
// sb.replace(15,20,"hello");
// System.out.println(sb);//StringIndexOutOfBoundsException: start > length()
sb.replace(1,3,"jkoi");
System.out.println(sb);// 插入的字符长度大于删除的字符长度
}
}
(五)、反转功能
public StringBuffer reverse()
导致此字符序列被序列的反向替换。 如果序列中包含任何代理对,则将这些代理对视为反向操作的单个字符。
设n是执行reverse方法之前的该字符序列的字符长度(不是char值中的长度)。
然后,新字符序列中索引k处的字符等于旧字符序列中索引nk-1处的字符。
public class StringBufferDemo5 {
public static void main(String[] args) {
//创建StringBuffer对象
StringBuffer sb = new StringBuffer();
sb.append("我爱晗鹿");
System.out.println(sb);
sb.reverse();
System.out.println("反转之后:" + sb);
}
}
(六)、 截取功能
1、 public String substring(int start)
返回一个新的String ,其中包含此字符序列中当前包含的字符的子序列。
子字符串从指定的索引开始并延伸到此序列的末尾。
2、 public CharSequence subSequence(int start, int end)
返回一个新的字符序列,
public class StringBufferDemo6 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("hello").append("world").append("java").append("spark");
System.out.println(sb);
String sb1 = sb.substring(6);
System.out.println("截取字符为:"+sb1 );
System.out.println("截取后原字符为:"+sb);
System.out.println("==============================");
String sb3 = sb.substring(5, 10);
System.out.println(sb3);
System.out.println("截取后原字符为:"+ sb);
System.out.println("=========将StringBuffer类型转换为String类型=================");
String sb4 = sb.substring(0);
System.out.println(sb4);
//System.out.println(sb==sb4);//java: 不可比较的类型: java.lang.StringBuffer和java.lang.String
}
}
(七)、 String类型与StringBuffer类型之间的相互转换
A,B
A--B ,将A类型转换成B类型,目的是为了使用B类型中的功能
B--A ,再将B转换成A类型 ,目的可能是最终的结果需要A类型,所以将它再次转换。
public class StringBuffer7 {
public static void main(String[] args) {
//String --StringBuffer (将String转换为StringBuffer,在StringBuffer中寻找方法,)
String s = "hello";
//方法一:构造方法
StringBuffer sb = new StringBuffer(s);
System.out.println(sb);
//方法二:使用StringBuffer中append方法
StringBuffer sb1 = new StringBuffer();
sb1.append(s);
System.out.println(sb1);
//判断sb与sb1是否转换为String类型
System.out.println(s.equals(sb));
System.out.println(s.equals(sb1));
System.out.println("=============================");
//StringBuffer--String
StringBuffer sb2 = new StringBuffer("hellowo");
//方法一:StringBuffer 中的截取方法
// sb2.substring(0);
// System.out.println(sb2);
//方法二:toString()方法 --最常用的方法
// String s1 = sb2.toString();
// System.out.println(s1);
//public String(StringBuffer buffer)
//分配一个新字符串
String s2 = new String(sb2);
System.out.println(s2);
}
}
(八)、String与StringBuffer作为参数传递的区别
public class StringBufferDemo8 {
public static void main(String[] args) {
String s1 = "hello";
// String s2 = "world";
// System.out.println("s1:" + s1 + ",s2:" + s2); // s1:hello,s2:world
// change(s1, s2);
// System.out.println("s1:" + s1 + ",s2:" + s2); // s1: hello ,s2: world
//但凡new出来的都在堆内存中,
// StringBuffer类append之后 ,返回的是什么
StringBuffer sb1 = new StringBuffer("hello");
StringBuffer sb2 = new StringBuffer("world");
System.out.println("sb1:" + sb1 + ",sb2:" + sb2); //sb1: hello ,sb2: world
change(sb1,sb2);
System.out.println("sb1:" + sb1 + ",sb2:" + sb2); // sb1: hello ,sb2: worldworld
}
// 当StringBuffer作为参数传递的时候,谁进行了操作,谁就发生了变化
public static void change(StringBuffer sb1,StringBuffer sb2){
sb1 = sb2;
sb2 = sb1.append(sb2);
System.out.println("sb1:" + sb1 + ",sb2:" + sb2); // sb1: worldworld ,sb2: worldworld
}
public static void change(String s1, String s2) {
s1 = s2;
s2 = s1 + s2;
System.out.println("s1:" + s1 + ",s2:" + s2); //s1: world ,s2:worldworld
}
}