Java基础 第三节 第四课

字符串拼接问题

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

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

在 API 中对 String 类有这样的描述: 字符串是常量, 它们的值在创建后不能被更改.

根据这句话分析我们的代码, 其实总共产生了三个字符串, 即 “Hello”, “World” 和 “HelloWorld”. 引用变量 s 首先指向 Hello 对象, 最终指向拼接出来的新字符串对象, 即 HelloWorld.

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

StringBuilder 概述

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

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

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

构造方法

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

  • public StringBuilder(): 构造一个空的 StringBuilder 容器
  • public StringBuilder(String str): 构造一个 StringBuilder 容器, 并将字符串添加进去
public class Test18 {
    public static void main(String[] args) {
        // 无参构造
        StringBuilder sb1 = new StringBuilder();
        System.out.println(sb1);  // 输出结果: (空白)

        // 有参构造
        StringBuilder sb2 = new StringBuilder("iamlittlewhite");
        System.out.println(sb2);  // 输出结果: iamlittlewhite
    }
}

常用方法

StringBuilder 常用的方法有 2 个:

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

append 方法

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

public class Test19 {
    public static void main(String[] args) {
        // 创建对象
        StringBuilder builder = new StringBuilder();
        // public StringBuilder append(任意类型)
        StringBuilder builder2 = builder.append("hello");
        // 对比一下
        System.out.println("builder:"+builder);
        System.out.println("builder2:"+builder2);
        System.out.println(builder == builder2); 
        // 可以添加 任何类型
        builder.append("hello");
        builder.append("world");
        builder.append(true);
        builder.append(100);
        // 在我们开发中,会遇到调用一个方法后, 返回一个对象的情况. 然后使用返回的对象继续调用方法.
        // 这种时候, 我们就可以把代码现在一起, 如append方法一样, 代码如下
        // 链式编程
        builder.append("hello").append("world").append(true).append(100);
        System.out.println("builder:"+builder);
    }
}

输出结果:
builder:hello
builder2:hello
true
builder:hellohelloworldtrue100helloworldtrue100

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

toString 方法

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

public class Test20 {
    public static void main(String[] args) {
        // 链式创建
        StringBuilder sb = new StringBuilder("Hello").append("World").append("Java");
        // 调用方法
        String str = sb.toString();
        System.out.println(str); // 调试输出: HelloWorldJava
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值