Java8源码 java.lang 包 03、AbstractStringBuilder 类

Java基础知识面试题(2026版) 序列号 内容 链接 1 Java基础知识面试题(2022版) 待续… 2 Java集合容器面试题(2022版) 待续… 3 Java异常面试题(2022版) 待续… 4 并发编程面试题 (2022版) 待续… 5 JVM面试题(2022版) 待续… 6 Spring面试题(2022版) 待续… 7 Spring MVC面试题(2022版) 待续… 8 Spring Boot面试题(2022版) 待续… 9 Spring Cloud面试题(2022版) 待续… .... 阅读详情

概述

String 类中有不少地方使用了 StringBuffer 和 StringBuilder 类,而这两个类都是继承自 AbstractStringBuilder 类,里面的很多实现都是直接使用父类的。

AbstractStringBuilder类的子类

类的定义

abstract class AbstractStringBuilder implements Appendable, CharSequence 
  1. 默认访问控制修饰符,说明只能在包内(jdk内)使用。即这个类只是给 StringBuffer 和 StringBuilder 类使用
  2. 是一个抽象类,只能被继承,不能直接创建对象。只有一个 toString 的抽象方法
  3. 实现了 Appendable 接口,Appendable 能够被追加 char 序列和值的对象。如果某个类的实例打算接收来自 Formatter 的格式化输出,那么该类必须实现 Appendable 接口,重写 append 方法
  4. 实现了 Charsequence 接口,代表该类,或其子类是一个字符序列

成员变量

    //用于存储字符序列
    char[] value;
    //数组中实际存储字符的数量
    int count;

这里的 value 和 String 类中的不同,是动态的,可提供给外部直接操作。

构造方法

    AbstractStringBuilder() {
    }

    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }

AbstractStringBuilder 提供两个构造函数,一个是无参构造函数。一个是传一个 capacity(代表数组容量) 的构造,这个构造函数用于指定类中 value 数组的初始大小,数组大小后面还可动态改变。

常用方法

实现CharSequence的方法

length()

    @Override  
	public int length() {
       // 返回已经存储字符序列的实际长度
        return count;
    }

charAt(int)

    @Override
    public char charAt(int index) {
        if ((index < 0) || (index >= count))
            throw new StringIndexOutOfBoundsException(index);
        return value[index];
    }

subSequence

    @Override
    public CharSequence subSequence(int start, int end) {
        return substring(start, end);
    }

    public String substring(int start, int end) {
        if (start < 0)
            throw new StringIndexOutOfBoundsException(start);
        if (end > count)
            throw new StringIndexOutOfBoundsException(end);
        if (start > end)
            throw new StringIndexOutOfBoundsException(end - start);
        return new String(value, start, end - start);
    }

getValue

    final char[] getValue() {
        return value;
    }

capacity

    public int capacity() {
        return value.length;
    }

返回当前 value 可以存储的字符容量,即在下一次重新申请内存之前能存储字符序列的长度。新添加元素的时候,可能会对数组进行扩容。

ensureCapacity

该方法是用来确保容量至少等于指定的最小值,是该类的核心也是其两个实现类 StringBuffer 和 StringBuilder 的核心。通过这种方式来实现数组的动态扩容。下面来看下其具体逻辑。

逻辑

1.判断入参 minimumCapacity 是否有效,即是否大于 0,大于 0 执行 ensureCapacityInternal() 方法,小于等于0 则忽略。

    public void ensureCapacity(int minimumCapacity) {
        if (minimumCapacity > 0)
            ensureCapacityInternal(minimumCapacity);
    }   

2.判断入参容量值是否比原容量大,如果小于或等于原容量则忽略。如果大于原容量,执行扩容操作。
实际上就是创建一个新容量的数组,然后再将原数组中的内容拷贝到新数组中。

    private void ensureCapacityInternal(int minimumCapacity) {
        if (minimumCapacity - value.length > 0) {
            value = Arrays.copyOf(value, newCapacity(minimumCapacity));
        }
    }

3.计算新数组的容量大小,新容量取原容量的 2 倍加 2 和入参 minCapacity 中较大者。然后再进行一些范围校验。新容量必需在 int 所支持的范围内,**之所以有 <=0 判断是因为,在执行 (value.length << 1) + 2操作后,可能会出现 int 溢出的情况。**如果溢出或是大于所支持的最大容量(MAX_ARRAY_SIZE 为 int 所支持的最大值减 8),则进行 hugeCapacity 计算,否则取 newCapacity

    // 要分配的数组的最大大小
	private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;    
    private int newCapacity(int minCapacity) {
        // overflow-conscious code
        int newCapacity = (value.length << 1) + 2;
        if (newCapacity - minCapacity < 0) {
            newCapacity = minCapacity;
        }
        return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
            ? hugeCapacity(minCapacity)
            : newCapacity;
    }

4.先进行范围检查,必须在 int 所支持的最大范围内。然后 在minCapacity 与 MAX_ARRAY_SIZE 之间取较大者,此方法取的范围是 Integer.MAX_VALUE - 8 到 Integer.MAX_VALUE 之间的范围。

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

总结

  1. 通过 value = Arrays.copyOf(value,newCapacity(minimumCapacity)); 进行扩容
  2. 新容量取 minCapacity和原容量乘以2再加上2中较大的那个,但不能大于 Integer.MAX_VALUE - 8 。
  3. 在实际环境中在容量远没达到 MAX_ARRAY_SIZE 的时候就报 OutOfMemoryError 异常了,其实就是在复制的时候创建了数组 char[] copy = new char[newLength]; 这里支持不了那么大的内存消耗,可以通过
    -Xms256M -Xmx768M 设置最大内存。

trimToSize

减少字符序列的使用空间,比如申请了100字符长度的空间,但是现在只用了 60 个,那剩下的 40 个无用的空间放在那里占内存,可以调用此方法释放掉未用到的内存。

    public void trimToSize() {
        if (count < value.length) {
            value = Arrays.copyOf(value, count);
        }
    }

原理很简单,只申请一个 count 大小的数组把原数组中的内容复制到新数组中,原来的数组由于没有被任何引用所指向,之后会被 gc 回收。

setLength

用空字符填充未使用的空间。首先对数组进行扩容,然后将剩余未使用的空间全部填充为’0’字符。

    public void setLength(int newLength) {
        if (newLength < 0)
            throw new StringIndexOutOfBoundsException(newLength);
        ensureCapacityInternal(newLength);

        if (count < newLength) {
            Arrays.fill(value, count, newLength, '\0');
        }

        count = newLength;
    }
	
	// Arrays类中的fill方法
    public static void fill(char[] a, int fromIndex, int toIndex, char val) {
        rangeCheck(a.length, fromIndex, toIndex);
        for (int i = fromIndex; i < toIndex; i++)
            a[i] = val;
    }

getChars

将字符序列中指定区间 srcBegin 到 srcEnd 内的字符拷贝到 dst 字符数组中从 dstBegin 开始往后的位置中。

    public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
    {
        if (srcBegin < 0)
            throw new StringIndexOutOfBoundsException(srcBegin);
        if ((srcEnd < 0) || (srcEnd > count))
            throw new StringIndexOutOfBoundsException(srcEnd);
        if (srcBegin > srcEnd)
            throw new StringIndexOutOfBoundsException("srcBegin > srcEnd");
        System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
    }

append 系列

AbstractStringBuilder 类中有一系列 append 方法,作用是在原字符序列后添加给定的对象或元素所对应的字符序列。这里挑一个代表讲解,其它方法原理类似。

    public AbstractStringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }

	public AbstractStringBuilder append(String str) {
        if (str == null)
            return appendNull();
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }
  1. 首先判断所传参数是否为 null,如果为 null 则调用 appendNull 方法,它会在原字符序列后加上 “null” 序列(如果有必要的话会先进行扩容)。
  2. 如果不为 null 则进行扩容操作,最小值为 count+len,这一步可能增加容量也可能不增加。
  3. 将参数的字符串序列添加到 value 中。
  4. 最后返回 this,注意这里返回的是 this,也就意味者,可以在一条语句中多次调用 append 方法,即调用链。原理简单,但思想值得借鉴。asb.append(“hello”).append(“world”);

delete

删除字符序列指定区间的内容。如果 start==end 则不作任何操作。这个方法不改变原序列的容量。

    public AbstractStringBuilder delete(int start, int end) {
        if (start < 0)
            throw new StringIndexOutOfBoundsException(start);
        if (end > count)
            end = count;
        if (start > end)
            throw new StringIndexOutOfBoundsException();
        int len = end - start;
        if (len > 0) {
            System.arraycopy(value, start+len, value, start, count-end);
            count -= len;
        }
        return this;
    }

deleteCharAt

删除字符序列中指定索引 index 位置的字符。

    public AbstractStringBuilder deleteCharAt(int index) {
        if ((index < 0) || (index >= count))
            throw new StringIndexOutOfBoundsException(index);
        System.arraycopy(value, index+1, value, index, count-index-1);
        count--;
        return this;
    }

replace

将原字符序列指定区间 start 到 end 区间内的内容替换为 str。

    public AbstractStringBuilder replace(int start, int end, String str) {
        if (start < 0)
            throw new StringIndexOutOfBoundsException(start);
        if (start > count)
            throw new StringIndexOutOfBoundsException("start > length()");
        if (start > end)
            throw new StringIndexOutOfBoundsException("start > end");
        if (end > count)
            end = count;
        int len = str.length();
        int newCount = count + len - (end - start);
        ensureCapacityInternal(newCount);
        System.arraycopy(value, end, value, start + len, count - end);
        str.getChars(value, start);
        count = newCount;
        return this;
    }

替换过程中序列长度会改变,所以需要进行扩容和改就 count 的操作。

substring

切割原字符序列指定区间 start 到 end 内的内容,返回结果子串。

    public String substring(int start) {
        return substring(start, count);
    }

	public String substring(int start, int end) {
        if (start < 0)
            throw new StringIndexOutOfBoundsException(start);
        if (end > count)
            throw new StringIndexOutOfBoundsException(end);
        if (start > end)
            throw new StringIndexOutOfBoundsException(end - start);
        return new String(value, start, end - start);
    }

insert 系列

insert 系列作用是将给定对象所对应的字符串插入到原序列的指定位置。insert 系列同 append 系列类似,只不过 append 是在原序列末尾添加元素,insert 是在指定位置插入元素。这里选一个代表进行讲解。

    public AbstractStringBuilder insert(int offset, String str) {
        if ((offset < 0) || (offset > length()))
            throw new StringIndexOutOfBoundsException(offset);
        if (str == null)
            str = "null";
        int len = str.length();
        ensureCapacityInternal(count + len);
        System.arraycopy(value, offset, value, offset + len, count - offset);
        str.getChars(value, offset);
        count += len;
        return this;
    }

indexOf

查询给定字符串在原字符序列中第一次出现的位置。

    public int indexOf(String str) {
        return indexOf(str, 0);
    }
    public int indexOf(String str, int fromIndex) {
        return String.indexOf(value, 0, count, str, fromIndex);
    }

lastIndexOf

返回指定字符在此字符串中最后一次出现处的索引。

    public int lastIndexOf(String str) {
        return lastIndexOf(str, count);
    }
    public int lastIndexOf(String str, int fromIndex) {
        return String.lastIndexOf(value, 0, count, str, fromIndex);
    }

reverse

将字符序列反转。如 “hellow” 执行 reverse 后变成 “wolleh”。

    public AbstractStringBuilder reverse() {
        // 判断字符序列中是否包含surrogates pair
        boolean hasSurrogates = false;
        int n = count - 1;
        for (int j = (n-1) >> 1; j >= 0; j--) {
            int k = n - j;
            char cj = value[j];
            char ck = value[k];
            value[j] = ck;
            value[k] = cj;
            if (Character.isSurrogate(cj) ||
                Character.isSurrogate(ck)) {
                hasSurrogates = true;
            }
        }
        if (hasSurrogates) {
            reverseAllValidSurrogatePairs();
        }
        return this;
    }

 	private void reverseAllValidSurrogatePairs() {
        for (int i = 0; i < count - 1; i++) {
            char c2 = value[i];
            if (Character.isLowSurrogate(c2)) {
                char c1 = value[i + 1];
                if (Character.isHighSurrogate(c1)) {
                    value[i++] = c1;
                    value[i] = c2;
                }
            }
        }
    }
  1. 将字符反转,count 为数组长度,因为是从 0 开始的所以这里需要减 1。具体转换是第一个字符与最后一个字符对调,第二个字符与倒数第二个字符对调,依次类推
  2. 实际上上述操作只需要循环 (n-1) /2 + 1 次(判断条件 j>=0 所以要 +1 次,源码中 >>1 就是除以 2)就可以了,如数组长度为 9 则需要循环 (9-1-1)/2 +1 = 4 次,9 个字符对调次,第 5 个位置的字符不用换,如果长度为 10 需要循环 (10-1-1)/2 +1 = 5 次
  3. 剩下的工作就是两个位置的元素互换
  4. 如果序列中包含 surrogates pair 则执行 reverseAllValidSurrogatePairs 方法

Surrogate Pair 是 UTF-16 中用于扩展字符而使用的编码方式,采用四个字节(两个 UTF-16 编码)来表示一个字符。 char 在 java 中是 16 位的,刚好是一个 UTF-16 编码。而字符串中可能含有 Surrogate Pair ,但他们是一个单一完整的字符,只不过是用两个 char 来表示而已,因此在反转字符串的过程中 Surrogate Pairs 是不应该被反转的。而 reverseAllValidSurrogatePairs 方法就是对 Surrogate Pair 进行处理。

从零开始:手把手教你规划与部署华为FusionCompute虚拟化平台(含网络规划避坑指南) 本文详细介绍了华为FusionCompute虚拟化平台的规划与部署流程,特别针对网络规划中的常见问题提供了避坑指南。从硬件软件清单检查、网络平面配置到VRM部署方案选择,帮助用户高效完成部署并优化性能,适用于云计算环境中的虚拟化平台搭建。 阅读详情

相关推荐

红外图像处理实战:用MATLAB实现时域高通滤波(THPF)去噪(附完整代码)

本文详细介绍了如何利用MATLAB实现时域高通滤波(THPF)算法进行红外图像去噪,包括核心原理、工程实现要点和完整代码示例。通过分析时间窗口选择、空域预处理优化和自适应参数调整等关键点,帮助开发者有效抑制固定图案噪声,适用于无人机载红外监测和安防监控等场景。

weixin_42783709的博客 182

Java源码___AbstractStringBuilder抽象类(一)

 java.lang.AbstractStringBuilder分析摘要: &amp;lt;1&amp;gt;简介 &amp;lt;2&amp;gt;常量 &amp;lt;3&amp;gt;replaceFirst(String regex, String replacement) &amp;lt;4&amp;gt;replaceAll(String regex, String replacement) &amp;lt;5&a

pseudonym_的博客 535

Sylvester结式法求解多项式方程

Sylvester结式法,结式,消元法,ctfshow 七夕杯 LUCK7,crypto,WriteUp

u010883831的博客 4528

JDK1.8源码阅读(三)Java.lang.AbstractStringBuilder

AbstractStringBuilder定义 abstract class AbstractStringBuilder implements Appendable, CharSequence {} AbstractStringBuilder是一个抽象类,实现了Appendable接口,能够被添加char序列和值,还实现了CharSequence可读的字符序列。 Abstra...

Johnson5971的博客 408

Prometheus-2.53.1安装

Prometheus+Grafana安装

qlj062127的博客 1787

双轴按键摇杆模块原理与嵌入式驱动实战

双轴按键摇杆是一种融合模拟量(X/Y轴)与数字量(Z轴按键)的复合型人机交互传感器,其本质基于电位器分压原理与机械开关通断特性。通过ADC采集连续电压信号并结合数字IO检测按键状态,可实现高鲁棒性的二维运动感知与触发控制。该方案技术门槛低、成本可控、兼容性强,广泛应用于智能小车、DIY游戏手柄、工业HMI及教育开发板等嵌入式场景。文中深入解析电位器线性度、KEY引脚开漏特性、ADC参考电压稳定性及软件消抖状态机等关键工程要素,为基于Arduino、STM32或ESP32平台的快速集成提供可复用的技术路径。

weixin_30995917的博客 81

Maven使用中的常见问题整理

Maven使用常见问题整理    1、更新eclipse的classpath加入新依赖    1、在dependencyManagement里面加入包括版本在内的依赖信息,如:      joda-time    joda-time     1.6.2         2、在同级的dependencies节点里面加入该依赖,如:      joda-time     jod

givemefive888的专栏 3万+

【入门篇】第五章 第一次与 AI Agent 交互

本文介绍了OpenClaw中最基本的用户与AI Agent交互方式,剖析了Agent和Gateway两个核心组件的作用,通过简单示例展示了从用户请求到结果返回的完整执行流程,说明了最小交互过程对验证系统可用性的重要意义,为后续学习复杂任务执行机制奠定基础。

lanyv的博客 512

06 java.lang.AbstractStringBuilder

AbstractStringBuilder 2015.01.15 By 970655147 这个类是StringBuider, StringBuffer 的基类,

970655147的专栏 1497

QGIS003:【02标注工具栏】-标注的样式、放置和属性修改

摘要:文本介绍了QGIS标注的样式、放置和属性修改

qq_31762031的博客 1916

Simulink仿真模块 - Data Type Conversion

Data Type Conversion将输入信号转换为指定的数据类型 在仿真库中的位置为: Simulink / 常用模块 Simulink / Signal Attributes 模型为: 说明 DataTypeConversion模块可将任何 Simulink®数据类型的输入信号转换为您指定的数据类型。 注意 要通过指定模块参数来控制输出数据类型,或者要从下游模块继承数据类型,使用DataTypeConversion模块。要...

jk_101的博客 2519

Android日常(03) Caused by: java.lang.IllegalStateException: Fragment xxxxFragment{2f4a09} not attached

Android日常(03) Caused by: java.lang.IllegalStateException: Fragment xxxxFragment{2f4a09} not attached to a context.写在前面的话问题出现的场景处理方式结束语 写在前面的话 出现这个问题的原因并没有找到 问题出现的场景 Activiy上面有个Fragment,Fragment上面又有三个子...

ZPCrobot的博客 1318

69页完整版智慧港口综合解决方案

智慧港口需求4港机远程操控等自动化改造需求自动化码头AGV无线通信及专用视频系统需求安全生产视频监控类需求港机RCMS及设备管理需求岸边智能理货码头三维全景应用智慧港口解决方案5自动化码头AGV/跨运车/无人集卡无线接入港机远控视觉及冗余无线通信视觉集卡防吊起系统集装箱码头岸边智能理货港机RCMS系统无线接入港机智能化管理(无线高清视频监控、一键报警、远程抄表系统)港口拖轮无线接入岸边溢油监测系统TD-LTE覆盖及业务终端接入港口生产管理系统港口可视化集群调度港口GiNMS综合网络设备智能管理全球作业效率最

zuoan1993的博客 2128

JDK1.8源码阅读记录lang包AbstractStringBuilder类

JDK1.8源码阅读记录 JAVA.LANG包 AbstractStringBuilder类 abstract class AbstractStringBuilder implements Appendable, CharSequence Appendable顾名思义,是append()的象征,CharSequence字符序列,有length()、charAt(int index)、subSeq...

weixin_43459704的博客 336

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

JDK源码解析之 Java.lang.AbstractStringBuilder

这个抽象类是StringBuilder和StringBuffer的直接父类,而且定义了很多方法,因此在学习这两个类之间建议先学习 AbstractStringBuilder抽象类 该类在源码中注释是以JDK1.5开始作为前两个类的父类存在的,可是直到JDK1.8的API中,关于StringBuilder和StringBuffer的父类还是Object 一、类定义 abstract class AbstractStringBuilder implements Appendable, CharSequenc.

栗筝i的博客 3865

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

我的jdk源码(三):AbstractStringBuilder类

一、概述 我们在jdk1.8的源码中可以看到,StringBuilder类和StringBuffer类都是继承了AbstractStringBuilder类的,并且很多方法都是直接使用的父类AbstractStringBuilder的方法,所以在学习StringBuilder类和StringBuffer类之前,先来研究一下AbstractStringBuilder的源码。 二、源码分析 (1)类的申明,源码如下: abstract class AbstractStringBuild...

Java觉浅的博客 1700

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JDK1.8源码学习--lang包(AbstractStringBuilder)

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同样希望大家最终都能从零到零,把知识从薄变厚,再由厚变薄! 1.AbstractStringBuilder的作用: 首先该抽象类是对StringBuilder和StringBuffer的具体抽象,这两个子类的大部分.

w5_Silence的博客 473

JDK1.8源码阅读记录lang包StringBuffer类、StringBuilder类

JDK1.8源码阅读记录 JAVA.LANG包 StringBuffer类 public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence StringBuffer继承AbstractStringBuilder,实现Seriali...

weixin_43459704的博客 254

JDK源码解析 - java.lang.AbstractStringBuilder

1.实现接口 abstract class AbstractStringBuilder implements Appendable, CharSequence {...} StringBuilder和StringBuffer都实现了这个类。Appendable接口有3个append抽象方法,CharSequence接口主要有length,charAt,subSequence,toString4个...

阶前空雨 366

JDK1.8源码学习--003、java.lang.AbstractStringBuilder

一、概述 StringBuffer 和 StringBuilder 两者都继承了AbstractStringBuilder、AbstractStringBuilder和String一样, 在其内部都是以字符数组的形式实现的。也就是String,StringBuffer以及StringBuilder在其内部都是以字符数组的形式实现的。 二、类声明 abstract class Abstra...

一叶知秋 687

java.lang.Abstr,src/java/lang/AbstractStringBuilder.java · 醉明月/LearningJDK - Gitee.com

/** Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.** This code is free software; you can redistribute it an...

weixin_42349277的博客 163

java.lang.StringBuilder源码解析

一、概要 可变字符序列,线程不安全,但是通常建议使用此类,因为StringBuilder更快。 每个StringBuilder都有一个容量,如果长度超过当前的容量,会自动扩容 二、实现接口和继承类 public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence 继承AbstractStringBuilder 实现java.io.Se

See_Csdn_的博客 273

JDK1.8源码阅读(四)Java.lang.StringBuffer

StringBuffer定义 public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence {} StringBuffer类被final修饰不能被继承,它继承了AbstractStringBuilder类,实现了Seria...

Johnson5971的博客 248

java.lang.AbstractStringBuiler源码解析(JDK1.8)

一、 此类是抽象类,继承了 Appendable, CharSequence接口。 abstract class AbstractStringBuilder implements Appendable, CharSequence 实现了CharSequence字符序列的接口 需要实现length()方法来获取字符序列的长度 需要实现charAt(int index)方法来获取指定位置的字符 需要实现subSequence(int start, int end)获取子序列 含有toString() 实现

See_Csdn_的博客 212

【AbsractStringBuilder】——java.lang.AbsractStringBuilder源码分析

一、AbstractStringBuilder类 这个抽象类是StringBuilder和StringBuffer的直接父类,而且定义了很多方法,因此在学习这两个类之间建议先学习 AbstractStringBuilder抽象类 该类在源码中注释是以JDK1.5开始作为前两个类的父类存在的,可是直到JDK1.8的API中,关于StringBuilder和StringBuffer的父类还是Ob...

我爱吃土豆 6811

Java源码学习 -- java.lang.StringBuilder,java.lang.StringBuffer,java.lang.AbstractStringBuilder...

一直以来,都是看到网上说“ StringBuilder是线程不安全的,但运行效率高;StringBuffer 是线程安全的,但运行效率低”,然后默默记住:一个是线程安全、一个线程不安全,但对内在原因并不了解。这两天终于下定决心看了下源代码,才深刻理解为啥一个线程安全、一个非线程安全。 一名话总结:java.lang.StringBuilder 与 java.lang.StringBuffer 同...

weixin_34319374的博客 183
上一篇: Java8源码 java.lang 包 02、String类
下一篇: Java8源码 java.lang 包 04、04.StringBuffer 和 StringBuilder
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值