java Stringbuilder

138 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

StringBuilder类

StringBuilder概述

查阅java.lang.StringBuilder的API,StringBuilder又称为可变字符序列,它是一个类似于 String 的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。

原来StringBuilder是个字符串的缓冲区,即它是一个容器,容器中可以装很多字符串。并且能够对其中的字符串进行各种操作。

说明:

1、缓冲区:就是一个临时空间,它里面可以临时存储数据。缓冲区本身就是一个容器。

2、字符串缓冲区:它本身就是一个容器,只不过这个缓冲区最后会把里面的所有数据全部给变成字符串而已。

3、当我们需要对字符串进行数据的修改,这时不能直接使用String类,而把需要修改的字符串先存储到字符串缓冲区容器中,在容器中进行各种修改,等最后确定不再修改的时候,把里面的数据变成一个字符串,然后存储在字符串常量池中。

StringBuilder类的特点

StringBuilder:

1)是一个字符串缓冲区,其实就是一个容器;

2)长度是可变的,任意类型都可以。注意:是将任意数据都转成字符串进行存储;

3)容器对象提供很多对容器中的数据操作的功能,比如添加,删除,修改,查询;

4)所有的数据最终都会变成一个字符串;

和数组最大的不同就是数组存储完可以单独操作每一个元素,每一个元素都是独立的。

字符串缓冲区,所有存储的元素都会被转成字符串,而且变成了一个更长的字符串。

StringBuilder存储数据的原理

它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容。StringBuilder会自动维护数组的扩容。原理如下图所示:(默认16字符空间,超过自动扩充)

注意:

解释:StringBuilder底层体现就是一个字符数组,StringBuilder类的对象将数组封装起来,然后对外提供很多便捷方法,而数组本身是没有什么太多方法的。如果外界将数据存放到底层的数组中,如果底层数组空间存放不下外界传递过来的值,那么jvm会基于原来存在的数组在创建一个新的数组,长度是原来数组的一倍+2,然后jvm将原来数组的数据全部复制(遍历数组,将数据添加到新的数组中)到新的数组中,然后在数组后面的空间中给数组添加新的值,如果还是存不下在创建一个新的数组。

StringBuilder类和String类的区别

  • String类:内容是不可变的
  • StringBuilder类:内容是可变的

StringBuilder类的构造方法

  • 常用的构造方法

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

public class StringBuilderDemo01 {
    public static void main(String[] args) {
        //public StringBuilder():创建一个空白可变字符串对象,不含有任何内容
        StringBuilder sb = new StringBuilder();
        System.out.println("sb:" + sb);
        System.out.println("sb.length():" + sb.length());//0
​
        //public StringBuilder(String str):根据字符串的内容,来创建可变字符串对象
        StringBuilder sb2 = new StringBuilder("hello");
        System.out.println("sb2:" + sb2);
        System.out.println("sb2.length():" + sb2.length());//5
    }
}

StringBuilder类添加和反转方法

  • 添加和反转方法

    方法名说明
    public StringBuilder append(任意类型)添加数据,并返回对象本身
    public StringBuilder reverse()返回相反的字符序列
  • 示例代码

public class StringBuilderDemo01 {
    public static void main(String[] args) {
        //创建对象
        StringBuilder sb = new StringBuilder();
​
        //public StringBuilder append(任意类型):添加数据,并返回对象本身
//        StringBuilder sb2 = sb.append("hello");
//
//        System.out.println("sb:" + sb);
//        System.out.println("sb2:" + sb2);
//        System.out.println(sb == sb2);//        sb.append("hello");
//        sb.append("world");
//        sb.append("java");
//        sb.append(100);
​
        //链式编程
        sb.append("hello").append("world").append("java").append(100);
​
        System.out.println("sb:" + sb);
​
        //public StringBuilder reverse():返回相反的字符序列
        sb.reverse();
        System.out.println("sb:" + sb);
    }
}

StringBuilder和String相互转换

  • StringBuilder转换为String

    public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String

  • String转换为StringBuilder

    public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder

  • 示例代码

public class StringBuilderDemo02 {
    public static void main(String[] args) {
        /*
        //StringBuilder 转换为 String
        StringBuilder sb = new StringBuilder();
        sb.append("hello");
​
        //String s = sb; //这个是错误的做法
​
        //public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String
        String s = sb.toString();
        System.out.println(s);
        */
​
        //String 转换为 StringBuilder
        String s = "hello";
​
        //StringBuilder sb = s; //这个是错误的做法
​
        //public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder
        StringBuilder sb = new StringBuilder(s);
​
        System.out.println(sb);
    }
}

练习:字符串拼接

案例需求

定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,

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

代码实现

/*
    思路:
        1:定义一个 int 类型的数组,用静态初始化完成数组元素的初始化
        2:定义一个方法,用于把 int 数组中的数据按照指定格式拼接成一个字符串返回。
          返回值类型 String,参数列表 int[] arr
        3:在方法中用 StringBuilder 按照要求进行拼接,并把结果转成 String 返回
        4:调用方法,用一个变量接收结果
        5:输出结果
 */
public class StringBuilderTest01 {
    public static void main(String[] args) {
        //定义一个 int 类型的数组,用静态初始化完成数组元素的初始化
        int[] arr = {1, 2, 3};
​
        //调用方法,用一个变量接收结果
        String s = arrayToString(arr);
​
        //输出结果
        System.out.println("s:" + s);
​
    }
​
    //定义一个方法,用于把 int 数组中的数据按照指定格式拼接成一个字符串返回
    /*
        两个明确:
            返回值类型:String
            参数:int[] arr
     */
    public static String arrayToString(int[] arr) {
        //在方法中用 StringBuilder 按照要求进行拼接,并把结果转成 String 返回
        StringBuilder sb = new StringBuilder();
        //向字符串缓冲区中添加一个[
        sb.append("[");
        //循环遍历数组取出数组中的每个数据
        for(int i=0; i<arr.length; i++) {
            //判断取出的数据是否等于数组最后一个数据
            if(i == arr.length-1) {
                //说明是数组最后一个数据 [1,2,3]
                sb.append(arr[i]).append("]");
            } else {
                //不是数组最后一个数据[1,2,
                sb.append(arr[i]).append(", ");
            }
        }
        //将字符串缓冲区转换为String对象
        String s = sb.toString();
        //返回字符串
        return  s;
    }
}