【Java基础进阶笔记】- Day01 - 第四章 StringBuilder类

Java基础进阶笔记 - Day01 - 第四章 StringBuilder类

系统:Win10
JDK:1.8.0_121
IDE:IntelliJ IDEA 2017.3.7

4.1 字符串拼接问题

由于String类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象。例如:

public class StringDemo01 {
    
    
    public static void main(String[] args) {
    
    
        String str = "Hello";
        str = str + "World";
        System.out.println(str);
    }
}

在API中对String类有这样的描述:字符串是常量,它们的值在创建后不能被更改
根据这句话分析我们的代码,其实总共产生了三个字符串,即 “Hello”、“World”“HelloWorld” 。引用变量str首先指向 Hello 对象,最终指向拼接出来的新字符串对象,即 HelloWorld
在这里插入图片描述

由此可知,如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。为了解决这一问题,可以使用java.lang.StringBuilder

4.2 StringBuilder概述

查阅java.lang.StringBuilder的API,StringBuilder又可称可变字符序列,它是一个类似于String的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容
原来StringBuilder是个字符串缓冲区,即它是一个容器,容器中可以装很多字符串。并且能够对其中的字符串进行各种操作。
它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容。StringBuilder会自动维护数组的扩容。原理如下图:(默认16字符: char[16] 空间大小,超过自动扩充)
在这里插入图片描述

4.3 构造方法


根据StringBuilder的API文档,常用的构造方法有2个:

  • public StringBuilder():构造一个空的StringBuilder容器
  • public StringBuilder(String str):构造一个StringBuilder容器,并将字符串添加进去
public class StringDemo02 {
    
    
    public static void main(String[] args) {
    
    
        StringBuilder sb1 = new StringBuilder();
        System.out.println("sb1:" + sb1);
        StringBuilder sb2 = new StringBuilder("StringBuilderDemo");
        System.out.println("sb2:" + sb2);
    }
}

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

4.4 常用方法

StringBuilder常用的方法有3个:

  • public StringBuilder append(…):添加任意类型数据的字符串形式,斌返回当前对象自身
  • public StringBuilder reverse():将当前StringBuilder对象进行反转
  • public String toString():将当前StringBuilder对象转换为String对象

append方法
append方法具有多种重载形式,可以接收任意类型的参数。任何数据作为参数都会将对应的字符串内容添加到StringBuilder中。例如:

public class StringDemo03 {
    
    
    public static void main(String[] args) {
    
    
        // 创建对象
        StringBuilder stringBuilder1 = new StringBuilder();
        StringBuilder stringBuilder3 = new StringBuilder();
        // public StringBuilder append(任意类型)
        StringBuilder stringBuilder2 = stringBuilder1.append("hello");
        // 对比一下
        System.out.println("stringBuilder1:" + stringBuilder1); // hello
        System.out.println("stringBuilder2:" + stringBuilder2); // hello
        System.out.println(stringBuilder1 == stringBuilder2); // true
        System.out.println("=========================");

        // 可以添加任何类型
        stringBuilder1.append("world");
        stringBuilder1.append(false);
        stringBuilder1.append(12345);
        /*
          在我们开发过程中,会遇到调用一个方法后,返回一个对象的情况。然后使用返回的对象继续调用方法
          这种时候,我们就可以把代码写在一起,如append方法一样,代码如下
         */
        stringBuilder3.append("hello").append("world").append(true).append(678910);
        System.out.println("stringBuilder1:" + stringBuilder1); // helloworldfalse12345
        System.out.println("stringBuilder3:" + stringBuilder3); // helloworldtrue678910
    }
}

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

备注:StringBuilder已经覆盖重写了Object类当中的toString方法

reverse方法
通过reverse方法,可以将StringBuilder对象进行反转

public class StringDemo04 {
    
    
    public static void main(String[] args) {
    
    
        StringBuilder sb1 = new StringBuilder("HelloWorld");
        System.out.println(sb1);
        System.out.println(sb1.reverse());
        System.out.println(sb1);
    }
}

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

toString方法
通过toString方法,StringBuilder对象将会转换为不可变的String对象,如:

public class StringDemo05 {
    
    
    public static void main(String[] args) {
    
    
        // 链式创建
        StringBuilder sb1 = new StringBuilder("Hello").append("World");
        // 调用方法
        String str = sb1.toString();
        System.out.println(str); // HelloWorld
    }
}

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

猜你喜欢

转载自blog.csdn.net/qq_35132089/article/details/111268558