常用类(4-1):StringBuffer类

常用类(4-1):StringBuffer类

String:字符串 Buffer:缓冲

在API中查找得到StringBuffer类在java.lang下面,不需要导包

一、StringBuffer类的概述

1、特点

(1)线程安全的
        不安全就是存在同步操作同一数据的行为,效率高
        安全的时候,没有同步操作,效率不高

        在开发中,效率和安全一直都是很难平衡的事情
        生活中有线程安全问题的例子:
            线程安全的例子: 银行的一些业务,医院取号,电影院售票
            线程不安全的例子:视频会员,博客评论

(2)线程安全,可变的字符序列
(3)字符串缓冲区就像一个String ,但可以修改
(4)在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容

特点简单记忆:StringBuffer是一个线程安全的可变字符串

2、StringBuffer与String的区别

(1)StringBuffer的长度和内容都是可以发生改变的,String不可变
(2)String每创建一个新的字符串都会开辟一个新的内存空间
    StringBuffer可以提前给出一个容量,可以进行字符串的拼接,而不会重新开辟

二、StringBuffer类的构造方法

1、StringBuffer()
        构造一个没有字符的字符串缓冲区,初始容量为16个字符
2、StringBuffer(int capacity)
        构造一个没有字符的字符串缓冲区和指定的初始容量(需要传入一个int类型的参数)
3、StringBuffer(String str)
   	构造一个初始化为指定字符串内容的字符串缓冲区(需要传入一个字符串参数)

1、StringBuffer():构造一个没有字符的字符串缓冲区,初始容量为16个字符

public class StringBufferDemo1 {
    public static void main(String[] args) {
        
       //StringBuffer() 构造一个没有字符的字符串缓冲区,初始容量为16个字符
       //按理说打印出的应该是对象的地址值,如果打印出的字符串,
       //那说明StringBuffer重写了Object中的toString()方法,
       //该方法将地址值转换为了字符串
        
       //创建StringBuffe对象
        StringBuffer sb1 = new StringBuffer();
        System.out.println("sb1:" + sb1);//打印sb1:,能看懂
        
        //public int capacity(),返回当前容量
        //查看StringBuffer的容量
        int capacity = sb1.capacity();
        System.out.println("StringBuffer的容量: " + capacity);
        
        int length = sb1.length();
        System.out.println("StringBuffer中字符串的长度: " + length);
       //capacity相当于一瓶水的容量,length相当于里面水的含量(可变的)
    }
}
        
            执行结果如下:
                        sb1:
                        StringBuffer的容量: 16
                        StringBuffer中字符串的长度: 0

                        Process finished with exit code 0

2、StringBuffer(int capacity):构造一个没有字符的字符串缓冲区和指定的初始容量

public class StringBufferDemo1 {
 public static void main(String[] args) {
     
  //StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区和指定的初始容量
  //构造一个50的容量
  //创建对象,传入int类型的参数
  StringBuffer sb2 = new StringBuffer(50);
  System.out.println("sb2:" + sb2); //StringBuffer重写的toString()方法
     
  int capacity2 = sb2.capacity();//查看StringBuffer的容量
  System.out.println("StringBuffer2的容量: " + capacity2);
  int length2 = sb2.length(); 
  System.out.println("StringBuffer2中字符串的长度: " + length2);
 }
}
     执行结果如下:
                 sb2:
                 StringBuffer2的容量: 50
                 StringBuffer2中字符串的长度: 0

                 Process finished with exit code 0

3、StringBuffer(String str):构造一个初始化为指定字符串内容的字符串缓冲区

```java
public class StringBufferDemo1 {
    public static void main(String[] args) {
    	//创建对象,传入一个字符串参数
      StringBuffer sb3 = new StringBuffer("hello");
        System.out.println("sb3:" + sb3);
        
        //查看sb3的容量
        int capacity3 = sb3.capacity();
        System.out.println("StringBuffer3的容量: " + capacity3); // 16+5
        int length3 = sb3.length(); //5
        System.out.println("StringBuffer3中字符串的长度: " + length3);

    }
}
            执行结果如下:
                        sb3:hello
                        StringBuffer3的容量: 21
                        StringBuffer3中字符串的长度: 5

                        Process finished with exit code 0
```

三、StringBuffer类的成员方法(添加、删除、替换、反转功能)

1、添加功能

(1)public StringBuffer append(String str)
//观察API发现,不光可以追加字符串类型,还可以将任意数据类型添加到字符串缓冲区中,
//返回的是字符串缓冲区本身(返回的是添加后的字符串)
    
(2)public StringBuffer insert(int offset,String str)
//将字符串插入到此字符序列中,返回的是字符串缓冲区本身(返回的是添加后的字符串)
//需要传入两个参数
(1)public StringBuffer append(String str)
public class StringBufferDemo2 {
    public static void main(String[] args) {
        //创建一个StringBuffer对象
        StringBuffer sb = new StringBuffer();
        //调取方法sb.append().var回车
        StringBuffer s = sb.append("hello");
        /*
            该方法将字符串类型的数据添加到了字符串缓冲区
            返回的是字符串缓冲区本身hello,所以s==sb
         */
        System.out.println(s);//hello
        System.out.println(sb);//hello
        System.out.println(s==sb);//true

        //还可以添加其他的数据类型进去
        sb.append(10);
        System.out.println(sb);//继续添加字符串10打印出:hello10

        sb.append('a');
        System.out.println(sb);//继续添加字符'a'打印出:hello10a

        sb.append(true);
        System.out.println(sb);//继续添加boolean类型打印出:hello10atrue

        sb.append(12.34);//继续添加double类型
        System.out.println(sb);//hello10atrue12.34

        System.out.println(s); //hello10atrue12.34
        /*
            sb和s都在栈中,new出来的东西都在堆中, 一开始sb指向new出来的东西
            用来接收的StringBuffer s 也在栈里面,指向new出来的东西
            堆里面的东西再怎么添加,地址值不会变,因此sb=s
         */

        //也可以使用链式编程
        sb.append(10).append('a').append(true).append(12.34);
        System.out.println(sb);//hello10atrue12.34
(2)public StringBuffer insert(int offset,String str)
public class StringBufferDemo2 {
    public static void main(String[] args) {
        //创建一个StringBuffer对象
        StringBuffer sb = new StringBuffer();

        //调取方法(sb.append().var回车)添加内容到缓冲区
        StringBuffer s = sb.append("hello");

        //public StringBuffer insert(int index,String str)
        //将字符串插入到此字符序列中。返回的是字符串缓冲区本身
        //String参数的String按顺序插入到指定偏移量的该序列中,
        //向上移动原始位于该位置的任何字符,并将该序列的长度增加到参数的长
        //如果str是null ,则四个字符"null"被插入到该序列中。
        sb.insert(3,"hadoop");//helhadooplo从索引值为3的位置开始添加
        System.out.println(sb);

        //传参是时候不能直接传入null,不然编译会报错
        // sb.insert(3,null);

        //传null时候,需要加双引号
        sb.insert(3,"null");
        System.out.println();//helnullhadooplo
        
        /*
        或者先定义,再传参
        String i = null;
        sb.insert(3,i);
        System.out.println(sb);//helnullhadooplo
         */
    }
}

2、删除功能

今后开发中,有关删除的单词:remove,move,delete,drop,truncate
删除功能
(1)public StringBuffer deleteCharAt(int index)
//删除char在这个序列中的指定位置的字符(该序列缩短了一个char)
    
(2)public StringBuffer delete(int start,int end)
//删除此序列指定区间内的所有字符(区间左闭右开)
(1)public StringBuffer deleteCharAt(int index):删除char在这个序列中的指定位置的字符
public class StringBufferDemo3 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("bigdata");
        System.out.println("未删除字符之前:"+sb);//bigdata

        //删除索引为3位置的字符
        sb.deleteCharAt(3);
        System.out.println("删除字符之后:"+sb);//bigata
        /*
            或者带返回值也行
            StringBuffer sb1 = sb.deleteCharAt(3);
            System.out.println("删除字符之后:"+sb1);
         */
        //如果 index为负数或大于或等于 length() ,报错
    }
}

(2)public StringBuffer delete(int start,int end):删除此序列指定区间内的所有字符
public class StringBufferDemo3 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("bigdata");
        System.out.println("未删除字符之前:"+sb);
        
        //public StringBuffer delete(int start,int end) 
        //删除此序列的子字符串中的字符
        /*
        子串开始于指定start并延伸到字符索引end - 1 ,区间左闭右开[start,end)
        区间内的字符通通删掉;如果start等于end ,则不作任何更改
        */
        
         //删除索引为2到5区间内的字符
        //2<=索引值<5
        sb.delete(2,5);
        System.out.println(sb);//bita

        //删除索引为2到6区间内的字符
		//sb.delete(2,6);
		//System.out.println(sb);//bia

		//使用目前所学的技术删除所有的字符
		//sb.delete(0,sb.length());
		//System.out.println("删除所有的字符sb: "+sb);输出的是个空,什么也没有
    }
}

3、替换功能

public StringBuffer replace(int start,int end,String str)
//将指定的字符/字符串,替换指定区间的字符/字符串(区间范围:左闭右开)
public class StringBufferDemo4 {
    public static void main(String[] args) {
        //创建一个StringBuffer对象
        StringBuffer sb = new StringBuffer();

        //往StringBuffer中添加内容
        //使用链式编程
   sb.append("hello").append("world").append("mysql").append("hadoop").append("hive");
        System.out.println(sb);//helloworldmysqlhadoophive

        //public StringBuffer replace(int start,int end,String str)
		//将指定的字符/字符串,替换指定区间的字符/字符串
        //区间范围:左闭右开(含头不含尾)
        sb.replace(5,10,"数加学院真好");
        System.out.println(sb);//hello数加学院真好mysqlhadoophive
    }
}

4、反转功能

public StringBuffer reverse()
导致该字符序列被序列的相反代替;如果序列中包含任何替代对,则将它们视为单个字符进行反向操作
public class StringBufferDemo5 {
    public static void main(String[] args) {
        //创建一个一个StringBuffer对象
        StringBuffer sb = new StringBuffer();
        //添加内容
        sb.append("我爱伟玉李");
        System.out.println("反转前:"+sb);

        //调用反转的方法
        StringBuffer reverse = sb.reverse();
        //可以直接调用sb
        System.out.println(sb);//李玉伟爱我
        System.out.println(reverse);//李玉伟爱我
    }
}

5、截取功能

(1)String substring(int start)
//从指定位置截取出来一个字符串输出(指定索引为x位置开始截取,x后面(不包含x)截取出来,然后输出)
//需要用返回值接收
    
(2)String substring(int start, int end)
//从指定区间截取出来一个字符串输出
//需要用返回值接收
(1)String substring(int start)
public class StringBufferDemo6 {
    public static void main(String[] args) {
        //创建一个StringBuffer对象
        StringBuffer sb = new StringBuffer();
        //添加内容
        sb.append("java")
                .append("hadoop")
                .append("hive")
                .append("ETL")
                .append("spark")
                .append("flink");
        System.out.println(sb);//javahadoophiveETLsparkflink

        //调用String substring(int start)方法,需要用返回值接收
        String s1 = sb.substring(4);
        System.out.println("截取出来的字符串是:" + s1);//hadoophiveETLsparkflink
        System.out.println("StringBuffer的内容为:" + sb);//javahadoophiveETLsparkflink
    }
}
(2)String substring(int start, int end)
public class StringBufferDemo6 {
    public static void main(String[] args) {
        //创建一个StringBuffer对象
        StringBuffer sb = new StringBuffer();
        //添加内容
        sb.append("java")
                .append("hadoop")
                .append("hive")
                .append("ETL")
                .append("spark")
                .append("flink");
        System.out.println(sb);//javahadoophiveETLsparkflink

        //String substring(int start, int end) ,需要同返回值接收
        //区间左闭右开
        String s2 = sb.substring(10, 17);
        System.out.println("截取出来的字符串是:" + s2);//hiveETL
        System.out.println("StringBuffer的内容为:" + sb);//javahadoophiveETLsparkflink
    }
}
posted @ 2021-12-19 17:09  阿伟宝座  阅读(267)  评论(0)    收藏  举报