Java基础(14)StringBuffer类

1.StringBuffer类

1. StringBuffer的概述:是一个线程安全的可变字符序列
2. StringBuffer和String的区别:String是长度不可变的字符序列,在对字符串进行拼接操作时,每次拼接都要创建一个新的String对象,程序执行效率不高。StringBuffer是长度可变的字符序列。StringBuffer其实可以看成是一个字符容器,可以不断地往这个容器里面添加数据
3. StringBuffer的方法
(1)构造方法

  • public StringBuffer():无参构造方法
  • public StringBuffer(int capacity):指定容量的字符串缓冲区对象
  • public StringBuffer(String str):指定字符串内容的字符串缓冲区对象

(2)方法

  • public int capacity():返回当前容量(默认初始容量为16个字符)【理论值】
  • public int length():返回当前的长度【实际值】
public class TestDemo01 {
    public static void main(String[] args) {
        StringBuffer sb1 = new StringBuffer();

        int capacity1 = sb1.capacity();   //获取容量
        System.out.println(capacity1);   //16

        int length1 = sb1.length();    //获取长度
        System.out.println(length1);  //0

        System.out.println("=================");

        StringBuffer sb2 = new StringBuffer(100);  //设定了容量

        int capacity2 = sb2.capacity();
        System.out.println(capacity2);  //100

        int length2 = sb2.length();
        System.out.println(length2);   //0

        System.out.println("=================");

        StringBuffer sb3 = new StringBuffer("abcdeasdcadasffcxqfadkh");

        //往字符串缓冲区中添加内容 如果超过了默认的容量,会自动扩充
        int capacity3 = sb3.capacity();
        System.out.println(capacity3);   //39  默认16+字符串长度23

        int length3 = sb3.length();
        System.out.println(length3);   //23

    }
}

4. StringBuffer的常用功能
(1)添加功能

  • public StringBuffer append():可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
  • public StringBuffer insert(int offset,Object obj):指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
public class TestDemo02 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        //链式编程
        sb.append("英雄联盟->").append("影流->").append("爱123我的天");
        //StringBuffer重写了toString()方法,把容器中的数据以字符串的形式返回
        String str = sb.toString();
        System.out.println(str);   //英雄联盟->影流->爱123我的天

        StringBuffer sb2 = new StringBuffer();
        //append()往容器中追加数据,可以把任意类型追加到容器中
        sb2.append(123).append('a').append("java").append(3.14).append(true);
        String str2 = sb2.toString();
        System.out.println(str2);   //123ajava3.14true

        // public StringBuffer insert(int offset,Object obj):指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
        sb.insert(6,"大区->");
        System.out.println(sb.toString());   //英雄联盟->大区->影流->爱123我的天
    }
}

(2)删除功能

  • public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
  • public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身(含头不含尾)
public class TestDemo03 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("啦啦啦啦德玛西亚");
        sb.deleteCharAt(0).deleteCharAt(0).deleteCharAt(0).deleteCharAt(0);
        System.out.println(sb.toString());   //德玛西亚

        StringBuffer sb2 = new StringBuffer("撸啊撸啊剑圣偷塔");
        sb2.delete(0,4);
        System.out.println(sb2.toString());  //剑圣偷塔
    }
}

(3)替换和反转功能

  • public StringBuffer replace(int start,int end,String str):从start开始到end用str替换
  • public StringBuffer reverse():字符串反转
public class TestDemo04 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("啦啦啦啦德玛西亚");
        sb.replace(0,4,"诺克萨斯,");
        System.out.println(sb.toString());   //诺克萨斯,德玛西亚

        StringBuffer sb2 = new StringBuffer("啦啦啦啦德玛西亚");
        sb2.reverse();
        System.out.println(sb2.toString());  //亚西玛德啦啦啦啦
    }
}

(4)截取功能【注意:返回值类型不是StringBuffer本身!是一个新的String】

  • public String substring(int start):从指定位置截取到末尾
  • public String substring(int start,int end):截取从指定位置开始到结束位置,包括开始位置,不包括结束位置
public class TestDemo05 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("啦啦啦啦德玛西亚");
        String str1 = sb.substring(4);
        System.out.println(str1.toString());   //德玛西亚

        StringBuffer sb2 = new StringBuffer("啦啦啦啦德玛西亚");
        String str2 = sb2.substring(2,5);
        System.out.println(str2.toString());   //啦啦德
    }
}

(5)查找功能

  • public int indexOf (String str):从头查找该字符串,在容器中第一次出现的索引,如果找不到就返回-1
  • int indexOf (String str,int fromIndex):从指定索引处开始查找该字符串第一次出现的索引,如果找不到就返回-1
public class TestDemo06 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("好运不会眷顾傻瓜");

        //int indexOf (String str)
        int i1 = sb.indexOf("傻");
        System.out.println(i1);   //6

        //int indexOf (String str,int fromIndex)
        int i2 = sb.indexOf("会",1);
        System.out.println(i2);   //3
    }
}

5. StringBuffer类型和String类型的相互转换
(1)StringBuffer—>String

  • 通过构造方法
  • 通过substring()方法
  • 通过toString()方法
    (2)String—>StringBuffer
  • 构造方法
  • 通过append()方法
public class TestDemo07 {
    public static void main(String[] args) {
        //StringBuffer--->String
        StringBuffer sb = new StringBuffer("你的剑就是我的剑");

        //1.构造方法
        String str1 = new String(sb);
        System.out.println(str1);   //你的剑就是我的剑
        //2.toString()方法
        String str2 = sb.toString();
        System.out.println(str2);   //你的剑就是我的剑
        //3.substring(0)方法
        String str3 = sb.substring(0);
        System.out.println(str3);   //你的剑就是我的剑

        System.out.println("===============");

        //String--->StringBuffer
        String s1 = "RNG牛逼";

        //1.构造方法
        StringBuffer sb2 = new StringBuffer(s1);
        System.out.println(sb2);   //RNG牛逼
        //2.append()方法
        StringBuffer sb3 = new StringBuffer();
        sb3.append(s1);
        System.out.println(sb3);   //RNG牛逼
    }
}

6. StringBuffer和StringBuilder的异同
(1)他们两个的API是相同的
(2)区别是:线程安全方面的区别

  • StringBuffer:线程安全的,效率低
  • StringBuilder:线程不安全的,效率高。多线程环境下,可能会存在线程安全问题

7. String和StringBuffer分别作为参数传递
(1)String作为参数传递 String虽然是引用类型,但是它是一个常量,所以在做传递的时候,完全可以将其看成基本数据类型数据进行传递
(2)StringBuffer作为引用类型进行参数传递

public class TestDemo08 {
    public static void main(String[] args) {
        String str = "RNG";
        test(str);   //RNG牛逼
        System.out.println(str);   //RNG

        StringBuffer sb = new StringBuffer("UZI");
        test(sb);   //UZI永远滴神
        System.out.println(sb);   //UZI永远滴神
    }

    public static void test(String str) {
        str += "牛逼";
        System.out.println(str);
    }

    public static void test(StringBuffer sb) {
        sb.append("永远滴神");
        System.out.println(sb);
    }
}

8. 两个关于StringBuffer的练习
(1)把数组中的数据按照指定格式拼接成一个字符串

/*
需求:把数组中的数据按照指定个格式拼接成一个字符串
        举例:
        int[] arr = {1, 2, 3};
        输出结果:
        "[1, 2, 3]"
        用StringBuffer的功能实现
 */
public class TestDemo01 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        StringBuffer sb = new StringBuffer("[");
        for (int i = 0; i <= arr.length - 1; i++) {
            if(i != arr.length - 1){
                sb.append(arr[i]).append(",");
            }else {
                sb.append(arr[i]).append("]");
            }
        }

        System.out.println(sb);
    }
}

(2)反转字符

/*
需求:把字符串反转
        举例:键盘录入 "abc"
        输出结果:"cba"
        用StringBuffer的功能实现
 */
public class TestDemo02 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入字符串");
        String str = sc.nextLine();

        String s = new StringBuffer(str).reverse().toString();
        System.out.println(s);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值