• 非零基础自学Java (老师:韩顺平) 第13章 常用类 13.6 StringBuilder类


    非零基础自学Java (老师:韩顺平)

    ✈【【零基础 快速学Java】韩顺平 零基础30天学会Java】

    第13章 常用类

    13.6 StringBuilder类

    在这里插入图片描述

    13.6.1 基本介绍

    一个可变的字符序列。

    此类提供一个与 StringBuffer兼容的API,但不保证同步(StringBuilder 不是线程安全)。

    该类被设计用作 StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。

    如果可能,建议优先采用该类因为在大多数实现中,它比 StringBuffer要快。

    在StringBuilder 上的主要操作是append 和 insert方法,可重载这些方法,以接受任意类型的数据。

    【举个栗子】

    package com.dingjiaxiong.stringbuilder_;
    
    /**
     * ClassName: StringBuilder01
     * date: 2022/9/4 16:52
     *
     * @author DingJiaxiong
     */
    
    public class StringBuilder01 {
        public static void main(String[] args) {
            
            //韩老师解读
            //老韩解读
            //1. StringBuilder 继承 AbstractStringBuilder 类
            //2. 实现了 Serializable ,说明StringBuilder对象是可以串行化(对象可以网络传输,可以保存到文件)
            //3. StringBuilder 是final类, 不能被继承
            //4. StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder的 char[] value;
            //   因此,字符序列是堆中
            //5. StringBuilder 的方法,没有做互斥的处理,即没有synchronized 关键字,因此在单线程的情况下使用
            //   StringBuilder
            
            StringBuilder stringBuilder = new StringBuilder();
        }
    }
    
    • 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
    13.6.2 StringBuilder常用方法

    StringBuilder 和StringBuffer均代表可变的字符序列,方法是一样的,所以使用和StringBuffer一样

    略。

    可参考官方文档。

    在这里插入图片描述

    13.6.3 String、StringBuffer 和 StringBuilder 的比较
    • StringBuilder和StringBuffer非常类似,均代表可变的字符序列,而且方法也一样
    • String:不可变字符序列,效率低,但是复用率高。
    • StringBuffer:可变字符序列、效率较高(增删)、线程安全
    • StringBuilder:可变字符序列、效率最高、线程不安全
    • String使用注意说明:
      • string s=“a”;//创建了一个字符串
      • s += “b”;//实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符串s+“b”(也就是"ab”)。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能
      • 结论:如果要对String做大量修改,不要使用String
    13.6.4 String、StringBuffer 和 StringBuilder 的效率测试

    结论:StringBuilder > StringBuffer > String

    【举个栗子】

    package com.dingjiaxiong.stringbuilder_;
    
    /**
     * ClassName: StringVsStringBufferVsStringBuilder
     * date: 2022/9/4 16:57
     *
     * @author DingJiaxiong
     */
    
    public class StringVsStringBufferVsStringBuilder {
        public static void main(String[] args) {
            long startTime = 0L;
            long endTime = 0L;
    
            StringBuffer buffer = new StringBuffer("");
            startTime = System.currentTimeMillis();
            for (int i = 0; i < 80000; i++) {
                buffer.append(String.valueOf(i)); //StringBuffer拼接80000次
            }
            endTime = System.currentTimeMillis();
            System.out.println("StringBuffer的执行时间为:" + (endTime - startTime));
    
    
            StringBuilder builder = new StringBuilder("");
            startTime = System.currentTimeMillis();
            for (int i = 0; i < 80000; i++) {
                builder.append(String.valueOf(i)); //StringBuilder拼接80000次
            }
            endTime = System.currentTimeMillis();
            System.out.println("StringBuilder的执行时间为:" + (endTime - startTime));
    
            String text = "";
            startTime = System.currentTimeMillis();
            for (int i = 0; i < 80000; i++) {
                text = text + i; //StringBuilder拼接80000次
            }
            endTime = System.currentTimeMillis();
            System.out.println("String的执行时间为:" + (endTime - startTime));
    
        }
    }
    
    • 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

    运行结果

    在这里插入图片描述

    13.6.5 String、StringBuffer 和 StringBuilder 的选择
    • 如果字符串存在大量的修改操作,一般使用 StringBuffer 或StringBuilder
    • 如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder
    • 如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer
    • 如果字符串很少修改,被多个对象引用,使用String, 比如配置信息等
  • 相关阅读:
    shouldComponentUpdate 是做什么的?
    同一个接口时快时慢。一次慢的,三四次是快的。怎么回事?
    机器学习概述、特征工程、机器学习算法基础
    delphi socket cross开源跨平台通讯库
    Matlab:表相关的函数
    虚拟机开启网络代理设置
    Facebook的数字社交使命:连接世界的下一步
    电脑装了w10没有w7流畅怎么办?
    [附源码]java毕业设计基于的图书馆管理系统
    【Java 基础篇】深入了解Java的File类:文件和目录操作指南
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/126926306