【Java】StringBuilder的基本操作

一、引入

如果我们用以前的方式去拼接 10000万 个字符串,代码也能写,但是拼起来之后速度非常非常慢。

但我想要的是速度非常非常快,所以就可以使用我们今天所学的 StringBuilder 开始拼接,这种方式 一下就拼接完毕了。

image-20240408150635616

StringBuilder 可以看成是一个容器,创建之后里面的内容是可变的。

因此它的作用就是用来提高字符串的操作效率。它只是操作字符串的一个工具,并不是真的字符串。

例如以下代码,String s6 = s1 + s2 + s3 + s4 + s5; 在拼接的过程中产生了很多没用的字符串,每一次通过 + 的拼接都会产生一个新的字符串,但这些东西非常影响内存和运行效率,这并不是我们想要的结果,我想要的是一种快捷的方式。

String s1 = "aaa";
String s2 = "bbb";
String s3 = "ccc";
String s4 = "ddd";
String s5 = "eee";
String s6 = s1 + s2 + s3 + s4 + s5;

此时就可以使用 StringBuilder ,StringBuilder可以看做是一个容器,里面的内容是可以发生变化的,因此当 s6 在变化的时候都是在一个容器里发生变化的,并不会产生那么多没有用的字符串。

image-20240408151407094


二、StringBuilder 的构造方法

StringBuilder 一共有两个构造。

方法名说明
public StringBuilder()创建一个空白可变字符串对象,不包含任何内容
public StringBuilder(String str)根据字符串的内容,来创建可变字符串对象

image-20240408151734748


三、StringBuilder 常用方法

方法名说明
public StringBuilder append(任意类型)添加数据,并返回对象本身
public StringBuilder reverse()反转容器中的内容
public int length()返回长度(字符出现的个数)
public String toString()通过 toString() 就可以把StringBuilder转换为String

代码示例

PS:在Java中起名字的时候会有个小习惯,如果变量名不知道起什么,就可以用类型的首字母来做变量名。而 StringBuilder 类型是两个单词,第一个单词首字母是 s,第二个单词首字母是 b,所以合起来就是 sb。同样我们也可以通过查阅 API帮助文档,看看它上面的示例命名是什么,可以发现,也是 `sb。

image-20240408152453115


下述代码很奇怪,sbnew 出来的对象,我打印一个对象应该是地址值才对,为什么这里什么都没有。

这是因为 StringBuilder 不是我们写的,而是Java已经写好的一个类。Java在底层对它做了一些特殊处理:打印对象不是地址值,而是属性值。

StringBuilder sb = new StringBuilder();
System.out.println(sb); // 结果是什么也没有

既然打印出来的是属性值,那下面代码打印结果就很好解释了。

StringBuilder sb = new StringBuilder("abc");
System.out.println(sb); // abc

调用其方法

package com.itheima.stringbuilderdemo;

public class StringBuilderDemo3 {
    public static void main(String[] args) {
        //1.创建对象
        StringBuilder sb = new StringBuilder("abc");

        //2.添加元素
        sb.append(1);
        sb.append(2.3);
        sb.append(true); // 将这些进行字符串拼接,只不过这种拼接是在单个容器内部的拼接,而不是产生新的字符串

        //3.反转
        // PS:它是在容器内部直接做了反转。它跟字符串不一样,字符串本身是不能变化的,只有返回值才是截取、替换之后的结果;而 StringBuilder容器 里的内容是可以发生变化的,一旦调用 reverse() 方法后,容器内的数据就直接被反转过来了。
        sb.reverse();

        //4.获取长度
        int len = sb.length();
        System.out.println(len);


        //打印
        //普及:
        //因为StringBuilder是Java已经写好的类
        //java在底层对他做了一些特殊处理。
        //打印对象不是地址值而是属性值。
        System.out.println(sb);
    }
}

使用 toString()

package com.itheima.stringbuilderdemo;

public class StringBuilderDemo4 {
    public static void main(String[] args) {
        //1.创建对象
        StringBuilder sb = new StringBuilder();

        //2.添加字符串
        sb.append("aaa");
        sb.append("bbb");
        sb.append("ccc");
        sb.append("ddd");

        System.out.println(sb);//aaabbbcccddd,但是这个 sb 并不能直接被当做字符串,因为 sb 是StringBuilder类型的,这个 sb 只是一个容器,是来帮助我们操作字符串的工具。因此在我们拼接完后,还需要再把 StringBuilder 变回字符串才可以。

        //3.再把StringBuilder变回字符串
        String str = sb.toString();
        System.out.println(str);//aaabbbcccddd
    }
}

四、链式编程

链式编程:表示当我们在调用一个方法的时候,不需要用变量接收它的结果,可以继续调用其他方法。

package com.itheima.stringbuilderdemo;

import java.util.Scanner;

public class StringBuilderDemo5 {
    public static void main(String[] args) {
        // getString() 得到的是一个字符串,我们就可以使用这个字符串去调用字符串中的 substring 方法。
        // substring 截取完后得到的又是一个新的字符串,此时我们还可以继续对这个新的字符串进行操作,例如 replace("A", "Q") ,将大写 A 替换成大写 Q 。
        // 替换完后再去调用 length() 获取它的长度,而 length() 方法获取的是一个整数,此时它就不能再去调用字符串的方法了。
        int len = getString().substring(1).replace("A", "Q").length();
        System.out.println(len);
    }

    public static String getString(){ // 获取键盘里的字符串,然后把字符串做一个返回
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String str = sc.next();
        return str;
    }
}

学习完链式编程之后,我们就可以对刚刚的代码进行一个简化。

这是因为当我们调用 append() 方法之后它会返回一个 StringBuilder 对象,也就是所它把调用者的容器进行了一个返回,因此每一次的 append() 都会将容器进行返回,因此 append() 方法的结果还是 StringBuilder 对象,即这里的 sb

image-20240408154424595

sb.append("aaa");
sb.append("bbb");
sb.append("ccc");
sb.append("ddd");

// 可直接写成
sb.append("aaa").append("bbb").append("ccc").append("ddd");

五、练习一:对称字符串

需求:键盘接受一个字符串,程序判断出该字符串是否是对称字符串,并在控制台打印是或不是

例如:

对称字符串:123321、111

非对称字符串:123123

代码示例:

package com.itheima.stringbuilderdemo;

import java.util.Scanner;

public class StringBuilderDemo6 {
    //使用StringBuilder的场景:
    //1.字符串的拼接
    //2.字符串的反转

    public static void main(String[] args) {
        //1.键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String str = sc.next();

        //2.反转键盘录入的字符串
        String result = new StringBuilder().append(str).reverse().toString();

        //3.比较
        if(str.equals(result)){
            System.out.println("当前字符串是对称字符串");
        }else{
            System.out.println("当前字符串不是对称字符串");
        }
    }
}

六、练习2:拼接字符串

需求:定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回。

调用该方法,并在控制台输出结果。例如:数组为int[] arr = {1,2,3}; 。执行方法后的输出结果为:[1, 2, 3]

代码示例:

package com.itheima.stringbuilderdemo;

public class StringBuilderDemo7 {
    public static void main(String[] args) {
        //1.定义数组
        int[] arr = {1,2,3};

        //2.调用方法把数组变成字符串
        String str = arrToString(arr);

        System.out.println(str);

    }

    public static String arrToString(int[] arr){
        StringBuilder sb = new StringBuilder();
        sb.append("[");

        for (int i = 0; i < arr.length; i++) {
            if(i == arr.length - 1){
                sb.append(arr[i]);
            }else{
                sb.append(arr[i]).append(", ");
            }
        }
        sb.append("]");
        return sb.toString();
    }
}
  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值