• 46_StringBuilder类


    第46章 StringBuilder类

    作者:张子默

    一、字符串拼接问题

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

    例如:

    public class StringDemo {
        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.StingBuilder的API,StringBuilder又称为可变字符序列,它是一个类似于String的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。

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

    它的内部拥有一个数组来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容。StringBuilder会自动维护数组的扩容。

    三、构造方法

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

    • public StringBuilder():构造一个空的StringBuilder容器。
    • public StringBuilder(String str):构造一个StringBuilder容器,并将字符串添加进去。
    public class StringBuilderDemo {
        public static void main(String[] args) {
            StringBuilder sb1 = new StringBuilder();
            System.out.println(sb1); // (空白)
            // 使用带参构造
            StringBuilder sb2 = new StringBuilder("itcast");
            System.out.println(sb2); // itcast
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    四、常用方法

    StringBuilder常用的方法有2个:

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

    1、append方法

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

    public class Demo02StringBuilder {
        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); //true
            // 可以添加 任何类型
            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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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

    2、toString方法

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

    public class Demo16StringBuilder {
        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
    • 10

    五、实例

    • 构造方法
    package com.zzm.day12.demo06;
    
    /**
     * 用途:
     * 时间:2021/6/29 17:59
     * 创建人:张子默
     */
    
    /*
    java.lang.StringBuilder类:字符串缓冲区,可以提高字符串的效率
        构造方法:
            StringBuilder():构造一个不带任何字符的字符串生成器,其初始容量为16个字符。
            StringBuilder(String str):构造一个字符串生成器,并初始化为指定的字符串内容。
     */
    public class Demo01StringBuilder {
    
        public static void main(String[] args) {
            // 空参数构造方法
            StringBuilder bu1 = new StringBuilder();
            System.out.println("bu1:" + bu1); // bu1:""
    
            // 带字符串的构造方法
            StringBuilder bu2 = new StringBuilder("abc");
            System.out.println("bu2:" + bu2); // bu2:abc
        }
    
    }
    
    • 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
    • append方法
    package com.zzm.day12.demo06;
    
    /**
     * 用途:
     * 时间:2021/6/29 18:05
     * 创建人:张子默
     */
    
    /*
    StringBuilder的常用方法:
        public StringBuilder append(...) :添加任意类型数据的字符串形式,并返回当前对象自身。
     */
    public class Demo02StringBuilder {
    
        public static void main(String[] args) {
            // 创建StringBuilder对象
            StringBuilder bu = new StringBuilder();
            // 使用append方法往StringBuilder中添加数据
            // append方法返回的是this,调用方法的对象bu,this==bu
            /*StringBuilder bu2 = bu.append("abc"); // 把bu的地址值赋值给了bu2
            System.out.println(bu); // abc
            System.out.println(bu2); // abc
            System.out.println(bu == bu2); // 比较的是地址值,true*/
    
            // 使用append方法无需接收返回值
           /* bu.append("abc");
            bu.append(1);
            bu.append(true);
            bu.append(8.8);
            bu.append('中');
            System.out.println(bu); // abc1true8.8中*/
    
            /*
            链式编程:方法返回值是一个对象,可以继续调用方法
             */
            System.out.println("abc".toUpperCase().toLowerCase().toUpperCase());
            bu.append("abc").append(1).append(true).append(8.8).append('中');
            System.out.println(bu);
        }
    
    }
    
    • 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
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • toString方法
    package com.zzm.day12.demo06;
    
    /**
     * 用途:
     * 时间:2021/6/29 18:15
     * 创建人:张子默
     */
    
    /*
    StringBuilder和String可以相互转换:
        String -> StringBuilder:可以使用StringBulder的构造方法
            StringBuilder(String str):构造一个字符串生成器,并初始化为指定的字符串内容。
        StringBuilder -> String:可以使用StringBuilder中的toString方法
            public String toString() :将当前StringBuilder对象转换为String对象。
     */
    public class Demo03StringBuilder {
    
        public static void main(String[] args) {
            // String -> StringBuilder
            String str = "hello";
            System.out.println("str:" + str);
            StringBuilder bu = new StringBuilder(str);
            // 往StringBuilder中添加数据
            bu.append("world");
            System.out.println("bu:" + bu);
    
            // StringBuilder -> String
            String s = bu.toString();
            System.out.println("s:" + s);
        }
    
    }
    
    • 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
    • 29
    • 30
    • 31
    • 32
  • 相关阅读:
    【JavaWeb】JSP技术详解
    1-1VMware介绍
    排序1:直接插入排序
    数据结构与算法 - 图
    python查看包的版本
    基于量子粒子群算法(QPSO)优化LSTM的风电、负荷等时间序列预测算法(Matlab代码实现)
    在量化交易过程中,散户可以这样做
    Django(三)接口自动化平台HttpRunnerManager本地部署
    【核心动画-转场动画-CATransition Objective-C语言】
    Shiro和Zuul权限管理整合方案
  • 原文地址:https://blog.csdn.net/a1448824839/article/details/125612761