我看JAVA 之 AbstractStringBuilder & StringBuffer & StringBuilder

简介:

我看JAVA 之 AbstractStringBuilder & StringBuffer & StringBuilder

注:基于jdk11

AbstractStringBuilder

可变的抽象字符串创建类

实现了如下几个接口:

1. Appendable    此接口的实现类可以拼接字符序列或单个字符。不保证线程安全,由实现类实现是否线程安全。使用java.util.Formatter格式化,必须为Appendable实现类
2. CharSequence

几个重要的成员变量:

/**
 * 字符串存储数据的字节数组,初始化的时候可以指定容量,默认为16
 */
byte[] value;

/**
 * 编码 0为Latin1 1为Utf-16
 */
byte coder;

/**
 * 当前字符串实际长度
 */
int count;

private static final byte[] EMPTYVALUE = new byte[0];

/**
    *  byte [] 最大长度限制,超过VM限制长度会导致OOM
    */
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

几个重要的方法:

1. 返回当前字符串实际长度,count
public int length() {
        return count;
}
2. 返回字符串容量
public int capacity() {
        return value.length >> coder;
}
3. 扩容,字节数组拷贝
public void ensureCapacity(int minimumCapacity) {
       if (minimumCapacity > 0) {
                ensureCapacityInternal(minimumCapacity);
      }
}

private void ensureCapacityInternal(int minimumCapacity) {
       // overflow-conscious code
       int oldCapacity = value.length >> coder;
       if (minimumCapacity - oldCapacity > 0) {
               value = Arrays.copyOf(value,
                    newCapacity(minimumCapacity) << coder);
       }
}
private int newCapacity(int minCapacity) {
        // overflow-conscious code
       int oldCapacity = value.length >> coder;
        int newCapacity = (oldCapacity << 1) + 2;
        if (newCapacity - minCapacity < 0) {
                newCapacity = minCapacity;
        }
    int SAFE_BOUND = MAX_ARRAY_SIZE >> coder;
    return (newCapacity <= 0 || SAFE_BOUND - newCapacity < 0)
            ? hugeCapacity(minCapacity)
            : newCapacity;
}

private int hugeCapacity(int minCapacity) {
        int SAFE_BOUND = MAX_ARRAY_SIZE >> coder;
       int UNSAFE_BOUND = Integer.MAX_VALUE >> coder;
       if (UNSAFE_BOUND - minCapacity < 0) { // overflow
                throw new OutOfMemoryError();
        }
        return (minCapacity > SAFE_BOUND)
            ? minCapacity : SAFE_BOUND;
}

StringBuffer

线程安全的AbstractStringBuilder实现类

几个重要的方法:

1. toString() 使用缓存机制,在第一次调用toString()的时候会将实时生成的字符串拷贝保存在toStringCache中,下次调用直接返回,如有变化,toStringCache置空

StringBuilder

非线程安全的AbstractStringBuilder实现类

几个重要的方法:

1. toString() 实时创建字符串拷贝返回
相关文章
|
3月前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
59 1
|
17天前
|
存储 SQL 安全
Java零基础-StringBuilder类详解
【10月更文挑战第12天】Java零基础教学篇,手把手实践教学!
19 5
|
18天前
|
存储 SQL 安全
Java零基础-StringBuilder类详解
【10月更文挑战第11天】Java零基础教学篇,手把手实践教学!
13 1
|
20天前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
21 2
|
2月前
|
安全 Java
String、StringBuffer、StringBuilder的区别
这篇文章讨论了Java中String、StringBuffer和StringBuilder的区别。String是不可变的,每次操作都会产生新的对象,效率低且浪费内存。StringBuilder可以在原字符串基础上进行操作,不开辟额外内存,弥补了String的缺陷。StringBuffer和StringBuilder类似,但StringBuffer的方法是线程安全的。文章还列举了StringBuffer的常用方法,并提供了使用示例代码。最后总结了这三者的主要区别。
String、StringBuffer、StringBuilder的区别
|
1月前
|
canal 安全 索引
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
33 5
|
14天前
|
存储 安全 Java
String、StringBuffer 和 StringBuilder 的区别
【10月更文挑战第21天】String、StringBuffer 和 StringBuilder 都有各自的特点和适用场景。了解它们之间的区别,可以帮助我们在编程中更合理地选择和使用这些类,从而提高程序的性能和质量。还可以结合具体的代码示例和实际应用场景,进一步深入分析它们的性能差异和使用技巧,使对它们的理解更加全面和深入。
9 0
|
2月前
|
安全 Java
Java StringBuffer 和 StringBuilder 类详解
在 Java 中,`StringBuffer` 和 `StringBuilder` 用于操作可变字符串,支持拼接、插入、删除等功能。两者的主要区别在于线程安全性和性能:`StringBuffer` 线程安全但较慢,适用于多线程环境;`StringBuilder` 非线程安全但更快,适合单线程环境。选择合适的类取决于具体的应用场景和性能需求。通常,在不需要线程安全的情况下,推荐使用 `StringBuilder` 以获得更好的性能。
|
3月前
|
API C# 开发者
WPF图形绘制大师指南:GDI+与Direct2D完美融合,带你玩转高性能图形处理秘籍!
【8月更文挑战第31天】GDI+与Direct2D的结合为WPF图形绘制提供了强大的工具集。通过合理地使用这两种技术,开发者可以创造出性能优异且视觉效果丰富的WPF应用程序。在实际应用中,开发者应根据项目需求和技术背景,权衡利弊,选择最合适的技术方案。
130 0
|
2月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
36 0
java基础(13)String类