七、StringBuffer 类和 StringBuilder 类

一、StringBuffer 类和 StringBuilder 类

StringBuffer 类简介:

        我们在日常开发中字符串可谓是随处可见,我们需要将字符串进行各种拼接,更改等操作,以此来获得我们所需要的字符串。但是字符串本身是不可改变的,所有在进行相关操作时,其实都会在原本字符串的基础之上重新创建字符串对象,这无疑会给内存造成更大的压力。而使用StringBuffer便可以很好的解决这个问题。

        还有一个类和 StringBuffer 的功能相同,这便是StringBuilder 类。StringBuilder类了解一些即可,通常都使用StringBuffer 来操作字符串

1、StringBuffer 类的构造方法与获取方法

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

  • StringBuffer 的获取方法
    • public int capacity():获取字符串对象的容量。(如果不自定义设置字符串缓存区容量,初始化默认容量是便是 16)。
    • public int length():返回字符串长度。

Demo代码示例:

public class StringBufferDemo {

    public static void main(String[] args) {
    
        // public StringBuffer():无参构造方法	
        StringBuffer sb = new StringBuffer();
        System.out.println("sb:" + sb);     
        //capacity(),获取字符串对象的容量
        System.out.println("sb.capacity():" + sb.capacity());
        System.out.println("sb.length():" + sb.length());

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

        // public StringBuffer(int capacity):指定容量的字符串缓冲区对象
        StringBuffer sb2 = new StringBuffer(50);
        System.out.println("sb2:" + sb2);
        System.out.println("sb2.capacity():" + sb2.capacity());
        System.out.println("sb2.length():" + sb2.length());
       
        System.out.println("==============================================");

        // public StringBuffer(String str):指定字符串内容的字符串缓冲区对象
        StringBuffer sb3 = new StringBuffer("hello");
        System.out.println("sb3:" + sb3);
        System.out.println("sb3.capacity():" + sb3.capacity());
        System.out.println("sb3.length():" + sb3.length());
    }
}

运行结果:
在这里插入图片描述


2、StringBuffer 类的添加方法

  • 添加功能
    • public StringBuffer append(String str):可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
    • public StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身

Demo代码示例:

public class StringBufferDemo {
    public static void main(String[] args) {
        // 创建字符串缓冲区对象
        StringBuffer sb = new StringBuffer();

        // 添加数据
        sb.append("hello");
        sb.append(true);
        sb.append(12);
        sb.append(34.56);

        // 上面的添加数据我们可以用链式编程开表示。你会发现结果是相同的
    //sb.append("hello").append(true).append(12).append(34.56);
        System.out.println("sb:" + sb);

        //在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
        sb.insert(5, "world");
        System.out.println("sb:" + sb);
    }
}

运行结果:
在这里插入图片描述


3、StringBuffer 类的删除方法

  • public StringBuffer deleteCharAt(int index):删除指定位置的字符,并以String的形式返回缓存区的字符串对象本身
  • public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并以String的形式返回缓存区的字符串对象本身

注:在使用字符串删除方法之前,在字符串缓存区中必须得有字符串的存在(和数组下标类似,在执行删除方法时,找不到指定下标的字符或者指定下标范围的字符串,便会报错。)


Demo代码示例:

public class StringBufferDemo {

    public static void main(String[] args) {
    
 			   // 创建字符串缓冲区对象
                StringBuffer sb = new StringBuffer();
                // 先在字符串缓存区中添加一些数据
                sb.append("A");//下标:0
                sb.append("B");//下标:1
                sb.append("C");//下标:2
                sb.append("D");//下标:3
                sb.append("E");//下标:4
                sb.append("F");//下标:5
                sb.append("G");//下标:6
                System.out.println("sb1:" + sb); //打印结果:sb1:ABCDEFG

                // 删除指定下标的字符,并返还字符串本身
                sb.deleteCharAt(1);
                System.out.println("sb2:" + sb); //打印结果:sb2:ACDEFG
                // 我们要删除world这个字符串,肿么办?
                sb.delete(3, 5);
                System.out.println("sb3:" + sb); //打印结果:sb3:ACDG
                // 需求:我要删除所有的数据
                 sb.delete(0, sb.length());
                System.out.println("sb4:" + sb); //打印结果:sb4:
    }
}

4、StringBuffer 类的替换方法

  • public StringBuffer replace(int start,int end,String str):根据下标去指定字符串范围,将该范围的字符串替换成所需的字符串。start 代表下标初始范围,end 代表下标结束范围,str 所指定的字符串会将 start 和 end 指定范围的的字符串进行替换。

Demo代码示例:

public class StringBufferDemo {

    public static void main(String[] args) {
    
 			   // 创建字符串缓冲区对象
                StringBuffer sb = new StringBuffer();
                // 先在字符串缓存区中添加一些数据
                sb.append("A");//下标:0
                sb.append("B");//下标:1
                sb.append("C");//下标:2
                sb.append("D");//下标:3
                sb.append("E");//下标:4
                sb.append("F");//下标:5
                sb.append("G");//下标:6
                System.out.println("sb1:" + sb); //打印结果:sb1:ABCDEFG

		       // 需求:我要把world这个数据替换为"洪荒之力"
		        sb.replace(1, 4, "bcd");
		        System.out.println("sb2:" + sb);
    }
}

5、StringBuffer 类的反转功能

  • public StringBuffer reverse()

Demo代码示例:

public class StringBufferDemo {

    public static void main(String[] args) {
    
 			   // 创建字符串缓冲区对象
                StringBuffer sb = new StringBuffer();
                // 先在字符串缓存区中添加一些数据
                sb.append("A");//下标:0
                sb.append("B");//下标:1
                sb.append("C");//下标:2
                sb.append("D");//下标:3
                sb.append("E");//下标:4
                sb.append("F");//下标:5
                sb.append("G");//下标:6
                System.out.println("sb1:" + sb); //打印结果:sb1:ABCDEFG

		        // 两极反转!!!
                sb.reverse();
                System.out.println("sb2:" + sb);//sb2:GFEDBCA
    }
}

6、StringBuffer 类的截取功能

  • public String substring(int start):设置指定结束下标,默认从0下标开始截取,将指定下标往后的字符串保留,删除从 0 至结束下标范围的字符串。
    • public String substring(int start,int end):start 代表开始下标范围,end 代表结束下标范围。只保留指定范围的字符串,其他下标范围字符全部清空。

Demo代码示例:

public class StringBufferDemo {

    public static void main(String[] args) {
    
 			  // 创建字符串缓冲区对象
                StringBuffer sb1 = new StringBuffer();

                // 在字符串缓存区中添加一些字符串
                sb1.append("A");//下标:0
                sb1.append("B");//下标:1
                sb1.append("C");//下标:2
                sb1.append("D");//下标:3
                sb1.append("E");//下标:4
                sb1.append("F");//下标:5
                sb1.append("G");//下标:6
                System.out.println("sb1:" + sb1);//sb1:ABCDEFG

                //设置指定结束下标,默认从0下标开始截取,将指定下标往后的字符串保留,删除从 0 至结束下标范围的字符串。
                String str1 = sb1.substring(1);
                System.out.println("str1:" + str1);//str1:BCDEFG

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

                StringBuffer sb2 = new StringBuffer();

                // 在字符串缓存区中添加一些字符串
                sb2.append("A");//下标:0
                sb2.append("B");//下标:1
                sb2.append("C");//下标:2
                sb2.append("D");//下标:3
                sb2.append("E");//下标:4
                sb2.append("F");//下标:5
                sb2.append("G");//下标:6
                System.out.println("sb2:" + sb2);//sb1:ABCDEFG
                //start 代表开始下标范围,end 代表结束下标范围。只保留指定范围的字符串,其他下标范围字符全部清空。
                String str2 = sb1.substring(1,4);
                System.out.println("str2:" + str2);//str2:BCD

    }
}

运行结果:
在这里插入图片描述


7、面试常问的问题

  • String 和 StringBuffer 之间的相互转换
public class StringBufferTest {
    public static void main(String[] args) {
        // String 转换 StringBuffer
        String s = "hello";
        // 注意:不能把字符串的值直接赋值给StringBuffer
        // StringBuffer sb = "hello";
        // StringBuffer sb = s;
        // 方式1:通过构造方法
        StringBuffer sb = new StringBuffer(s);
        // 方式2:通过append()方法
        StringBuffer sb2 = new StringBuffer();
        sb2.append(s);
        System.out.println("sb:" + sb);//sb:hello
        System.out.println("sb2:" + sb2);//sb2:hello

        // StringBuffer转换 String
        StringBuffer buffer = new StringBuffer("java");
        // String(StringBuffer buffer)
        // 方式1:通过构造方法
        String str = new String(buffer);
        // 方式2:通过toString()方法
        String str2 = buffer.toString();
        System.out.println("str:" + str);//str:java
        System.out.println("str2:" + str2);//str2:java
    }
}
  • 2、String和StringBuff和StringBuilder区别?
    • String:不可变序列
    • StringBuffer:可变序列,多线程,安全
    • StringBuilder:可变序列,单线程,不安全
  • 3、StringBuffer和数组的区别?
    • 都是容器,可以用来存数据但是数组只能存一种数据,但是StringBuffer可以存很多种类型数据,不过最终结果都是字符串数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值