• String、StringBuffer以及StringBuilder的比较


    1.String类

    1.1String类的理解和创建对象

    (1)String对象用于保存字符串,也就是一组字符序列
    (2)字符串常量对象是用双引号括起来的字符序列
    (3)字符串的字符使用Unicode字符编码。一个字符(不区分字母还是汉字)占两个字节
    (4)String是final类,不能被其他类继承
    (5)String有属性 private final char value[];用于存放字符串内容
    注意:value是一个final类型,不可以修改(即value不能指向新的地址,但是单个字符内容是可以改变的)

           final char[] value = {'a', 'b', 'c', 'd'};
            char[] v = {'t', 'o', 'm'};
            value[0] = 'H';
           // value = v; 会报错
    
    • 1
    • 2
    • 3
    • 4

    (6)String类的常用构造方法
    ①String(): 初始化一个新创建的 String 对象,使其表示一个空字符序列。
    ②String(String original): 初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;
    换句话说,新创建的字符串是该参数字符串的副本。
    ③String(char[] value):
    分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。
    ④String(char[] value, int offset, int count):
    分配一个新的 String,它包含取自字符数组参数一个子数组的字符。
    ⑤String(byte[] bytes):
    通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
    ⑥String(byte[] bytes, int offset, int length):
    通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。
    (7)String类的继承关系
    在这里插入图片描述
    ①实现Serializable接口:说明String可以串行化
    ②实现Comparable接口:说明String对象可以相互比较

    1.2 两种创建String对象的区别

    方式一:直接赋值 String s = "hsp";
    方式二:调用构造器 String s2 = new String("hsp");
    (1)方式一:先从常量池查看是否有“hsp”数据空间,如果有,直接指向;如果没有,则重新创建,然后指向。
    s最终指向的是常量池的空间地址。
    (2)方式二:先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。如果常量池没有“hsp”,重新创建;
    如果有,直接通过value指向。最终指向堆中的空间地址。

    在这里插入图片描述

    1.3 String类的常用方法

    (1)equals // 区分大小写,判断内容是否相等
    (2)equalsIgnoreCase // 忽略大小写,判断内容是否相等
    (3)length // 获取字符的个数,即字符串的长度
    (4)indexOf // 获取字符在字符串中第一次出现的索引,索引从0开始,如果找不到,返回-1
    (5)lastIndexOf //获取字符在字符串中最后一次出现的索引,索引从0开始,如果找不到,返回-1
    (6)substring // 截取指定范围的字符
    (7)trim // 去掉前后空格
    (8)charAt // 获取某索引处的字符

    Sring类是保存字符串常量的。每次更新都需要重新开辟空间,效率较低。因此,Java设计者
    还提供了StringBuilder和StringBuffer来增强String的功能,并提高效率。

    2.StringBuffer类

    (1)java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删。
    (2)很多方法和String相同,但StringBuffer是可变长度。
    (3)StringBuffer是一个容器。

    2.1 StringBuffer类的理解

    在这里插入图片描述
    (1)StringBuffer的直接父类是AbstractStringBuilder
    (2)StringBuffer实现了Serializable,即StringBuffer的对象可以串行化
    (3)在父类中,AbstractStringBuilder 有属性 char[] value,不是final;
    该value数组存放字符串内容,该字符串内容存是放在堆中的
    (4)StringBuffer是一个final类,不能被继承
    (5)因为StringBuffer字符内容是存在 char[] value,所以再变化(增加/删除),
    不用每次都更换地址(即不用每次都创建新对象),所以效率高于String

    2.2 String与StringBuffer的对比

    (1)String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低
    //private final char value[]
    (2)StringBuffer保存的是字符串常量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用每次更新地址,效率较高。
    // char[] value; 放在堆中

    2.3 String与StringBuffer的相互转换

    //  (1) String --> StringBuffer
            String str = "hello tom";
    //     方式1: 使用构造器
    //     注意:返回的是StringBuffer对象,对str本身没有影响
            StringBuffer stringBuffer = new StringBuffer(str);
    //     方式2: 使用append方法
            StringBuffer stringBuffer1 = new StringBuffer();
            stringBuffer1 = stringBuffer1.append(str);
    //  (2) StringBuffer --> String
            StringBuffer buffer1 = new StringBuffer("hi jerry");
    //       方式1: 使用StringBuffer提供的 toString方法
            String s = buffer1.toString();
    //      方式2: 使用构造器来搞定
            String s1 = new String(buffer1);
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3.StringBuilder类的理解

    (1)一个可变的字符序列。此类提供了一个与StringBuffer兼容的API,但不保证同步(不是线程安全的)。该类被设计用作
    StringBuffer的一个简易替换,用在字符串被单个线程使用的时候。如果可能,建议优先采用该类,因为在
    大多数实现中,它比StringBuffer要快。
    (2)StringBuffer上的主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据。
    在这里插入图片描述

    4.三者比较

    (1)StringBuilder和StringBuffer非常类似,均代表可变的字符序列,而且方法也一样
    (2)String:不可变字符序列,效率低,但是复用率高(常量池中的数据可以共用)
    (3)StringBuffer:可变字符序列、效率较高(增删)、线程安全
    (4)StringBuilder:可变字符序列、效率最高、线程不安全

  • 相关阅读:
    使用Python进行页面开发——Django常用Web工具
    计算机毕业设计SSM电影分享网站【附源码数据库】
    韦东山linux驱动开发学习【常更】
    shell脚本按日期范围和间隔下载数据
    [免费专栏] Android安全之绕过直连、HOST校验、系统证书校验、代理检测、双向认证抓HTTPS数据
    JAVA上机题(3道)
    持续集成部署-SonarQube 环境搭建
    5.最长回文子串
    Linux-gdb调试方式二(gdb和gdbserver)
    力扣练习——50 网络延迟时间
  • 原文地址:https://blog.csdn.net/y516369/article/details/126004653