Java基础 第三节 第四课

举报
我是小白呀iamarookie 发表于 2021/09/10 01:08:40 2021/09/10
【摘要】 StringBuilder 类 字符串拼接问题StringBuilder 概述构造方法常用方法append 方法toString 方法 字符串拼接问题 由于 String 类的对象内容...

字符串拼接问题

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

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在 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
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

常用方法

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

注: 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

文章来源: iamarookie.blog.csdn.net,作者:我是小白呀,版权归原作者所有,如需转载,请联系作者。

原文链接:iamarookie.blog.csdn.net/article/details/110228883

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。