【SE-04】String、StringBuilder、StringBuffer
发布日期:2021-05-07 08:58:13 浏览次数:19 分类:精选文章

本文共 2236 字,大约阅读时间需要 7 分钟。

String、StringBuffer与StringBuilder的技术深度解析

String的特性

String在Java中是不可变的字符序列,这一特性体现在以下几个方面:

  • 不可变性

    当对字符串重新赋值时,需要重新指定内存区域,不能直接修改原有的对象。
    例如,str = new String("test") 会创建一个新的字符串对象,而不是修改原有的字符串。

  • 修改操作

    对字符串的任何修改操作(如拼接、replace()等),都不会在原来的对象上直接修改,而是重新新建了一个修改后的对象。
    例如,str.replace("o", "x") 会返回一个新的字符串,而不是修改原有的字符串。

  • 内存管理

    String底层维护的是一个final类型的字符数组,且其本身也为final
    Java中是按值传递,只有对象引用按值传递,基本数据类型和字符串都是按值传递,无法通过方法修改对象指针。

  • String的定义方式

    字符串在Java中可以通过以下几种方式定义:

  • 使用new操作符

    String str = new String(new char[]{'a', 'b', 'c'});
    或者 String str = new String("abc");
    这种方式适用于已知具体内容的情况。

  • 字符串字面常量

    String str = "abc";
    这种方式最常用,且在编译时会进行优化。

  • 构造器

    String str = new String("abc", 2, 5);
    这种方式适用于需要指定子字符串的情况。

  • 字符串拼接

    String str = "a" + "b" + "c";
    这种方式在多次拼接时会多次创建新的字符串对象,效率较低。

  • 常见方法

    String类中提供了一系列操作方法,主要包括以下几种:

  • length():返回字符串的长度。
  • charAt(int index):返回指定索引位置的字符。
  • substring(int beginIndex, int endIndex):返回子字符串。
  • contains(String sequence):检查字符串是否包含指定子字符串。
  • startsWith(String prefix):检查字符串是否以指定前缀开头。
  • indexOf(String sequence):返回指定子字符串在当前字符串中的索引。
  • 需要注意的是,所有修改操作都会返回新的字符串对象,而不是修改原有的字符串对象。

    StringBuffer与StringBuilder

    StringBuffer

  • 基本介绍

    StringBuffer是可变的字符序列,支持多线程操作,线程安全机制通过 synchronized 锁实现。

  • 底层实现

    StringBuffer底层创建了一个长度为(构造器内字符数+16)的字符数组。
    例如:

    StringBuffer stringBuffer1 = new StringBuffer(); // 初始长度为16  
    StringBuffer stringBuffer2 = new StringBuffer("aaa"); // 初始长度为19
  • 扩容机制

    当字符序列超出当前数组容量时,底层会扩容为原有容量的2倍+2,并将原有数组复制到新数组中。
    例如:

    public void append(char c) {  
    ensureCapacity(size() + 1);
    char[] value = array;
    value = new char[value.length * 2 + 2];
    System.arraycopy(value, 0, array, 0, array.length);
    array = value;
    array[size++] = c;
    }
  • 线程安全

    StringBuffer的所有操作都对锁进行了处理,确保线程安全。

  • StringBuilder

  • 基本介绍

    StringBuilder是不可线程安全的高效字符串操作类,JDK5.0新增。

  • 线程安全性

    StringBuilder的操作是不带锁的,因此在多线程环境中可能会出现数据不一致的问题。

  • 效率

    StringBuilder的操作效率比StringBuffer高,主要体现在不需要锁的开销。

  • 常用方法

    public StringBuilder append(char c) {  
    super.append(c);
    return this;
    }
    public StringBuilder append(CharSequence seq) {
    super.append(seq);
    return this;
    }
  • 三者比较

    特性 String StringBuffer StringBuilder
    是否可变 不可变 可变 可变
    是否线程安全 不安全 安全 不安全
    内存分配方式 内部数组 内部数组 内部数组
    性能 最差 较差 较好
    常用场景 文本处理 大量修改 大量修改

    总结

    String、StringBuffer与StringBuilder三者各有优劣,选择时应根据具体需求决定。String适用于不可变的文本处理;StringBuilder适合需要高效操作的场景;而StringBuffer则是线程安全的选择。

    上一篇:vue实例对象中的属性、方法
    下一篇:vue(10):路由传参、路由嵌套、路由命名视图

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年04月19日 05时04分03秒