String内部是一个private final char value[];
也就意味着每次调用的各种处理方法,返回的字符串都是一个新的,性能上,显然....
所以,对于可变字符序列的需求是很明确的
类的层次结构设计,有的时候是自顶而下
有的时候是总结归纳,然后抽象出来一个新的类,这很正常
尽管StringBuffer 要比StringBuilder 和 AbstractStringBuilder要早得多了
但是StringBuffer 现在也继承了这个类
所以说,抛开发展历史的过程不说,直接从类的层级结构设计的角度看的话
你可以认为AbstractStringBuilder 就是对于可变字符序列的这一概念的描述
他提供了可变字符序列的一个基本协议约定,也就是基本的功能方法
作为一个抽象类, 并且也提供了一部分默认的实现
StringBuffer和StringBuilder都是可变的字符序列,所以他们都实现了AbstractStringBuilder
 

属性简介

内部是一个char[] value不再是final的了,也就意味着可变
他实现了CharSequence接口意味着他是一个字符序列
实现了Appendable接口,意味着他遵循了追加相关的协议
内部使用char[] value进行数据存储 , 这个char[] value 是核心
他是有容量大小的,因为数组必然有长度
如果长度没有超出此容量,就无需分配新的内部缓冲区数组
如果内部缓冲区溢出,则此容量自动增大
 
使用count 记录已经使用的字符个数
 
还可以通过有参数的构造方法进行初始化设置value这个字符数组的大小
当然构造方法不是给你用的,是给子类用的
 
既然本质是一个char[] 字符数组,所以可以说所有的操作都是对于数组的操作
那么对于一个字符序列,有哪些方法是刚需呢?
也无外乎添加元素/删除元素/更新元素/获取元素 这几种
添加有可能是插入中间或者在最后追加
 
我们知道,数组是顺序存储
所以对于插入这种操作必然会出现大量的元素移动情况
 

属性获取

既然是内部维护了字节数组
必然这个数组本身属性,长度 ,使用个数的获取,以及数组的扩大也有相对应的方法可以使用
length() 获取实际数据的个数
capacity() 数组的大小 所以是容量
public void setLength(int newLength) 设置为指定长度

如果 newLength 参数小于当前长度
则长度将更改为指定的长度, 截断,数据不变
 
如果 newLength 参数大于或等于当前长度
则将追加有效的 null 字符 ('\u0000'),使长度满足 newLength 参数
public void ensureCapacity(int minimumCapacity)
确保容量至少等于指定的最小值
如果 minimumCapacity 参数为非正数,则此方法不执行任何操作并返回
 
参数大于当前容量才会执行扩展
 
新容量的大小应大于:minimumCapacity 参数 并且大于 旧容量的两倍加 2  
 
public void trimToSize() 尝试缩减空间
如果实际使用的个数小于容量,那么进行缩减
 

添加方法

就像我们刚才说的那样,添加元素,分为尾部追加元素中间插入元素
添加元素的方法也分为了两大阵营
AbstractStringBuilder append(Object obj) AbstractStringBuilder insert(int offset, Object obj) 
AbstractStringBuilder append(boolean b) AbstractStringBuilder insert(int offset, boolean b)
AbstractStringBuilder append(char c) AbstractStringBuilder insert(int offset, char c)
AbstractStringBuilder append(int i) AbstractStringBuilder insert(int offset, int i)
AbstractStringBuilder append(long l) AbstractStringBuilder insert(int offset, long l)
AbstractStringBuilder append(float f) AbstractStringBuilder insert(int offset, float f)
AbstractStringBuilder append(double d) AbstractStringBuilder insert(int offset, double d)
AbstractStringBuilder append(CharSequence s) AbstractStringBuilder insert(int dstOffset, CharSequence s)
AbstractStringBuilder append(CharSequence s, int start, int end)
AbstractStringBuilder insert(int dstOffset, CharSequence s,int start, int end)
AbstractStringBuilder append(char[] str) AbstractStringBuilder insert(int offset, char[] str)
AbstractStringBuilder append(char str[], int offset, int len)
AbstractStringBuilder insert(int index, char[] str, int offset, int len)
AbstractStringBuilder append(String str) AbstractStringBuilder insert(int offset, String str)
AbstractStringBuilder append(StringBuffer sb)  
AbstractStringBuilder appendCodePoint(int codePoint)  
 
 
从上表可以看得出来,给各种数据类型都提供了append和insert方法
对于insert 是插入,既然是插入,那么就需要指定位置
所以与append对应的方法的方法签名上,都多了一个索引
所有的方法的返回类型都是AbstractStringBuilder
其实都是
return this;
因为他是可变的,所以变化直接体现在了this中,所以返回this就好了
appendCodePoint(int codePoint) 与  append(char c)  可以说是一样的
但是对于辅助平面显然又不一样,char不支持辅助平面
 

获取方法

获取代码点

代码点相关的五个方法
charAt(int) / codePointAt(int) / codePointBefore(int) / codePointCount(int, int) / offsetByCodePoints(int, int)
他们与String中的是一模一样的,代码也是一样的(就有个变量名变动)
 

复制

getChars(int, int, char[], int)
将字符从此序列复制到目标字符数组 dst  与String中的方法也几乎一致

索引下标

int indexOf(String str)
int indexOf(String str, int fromIndex)
第一次出现的指定子字符串在该字符串中的索引
可以指定索引
指定索引就从索引处开始查找匹配
满足的条件为startsWith true (并且在范围内 如果有设置)
int lastIndexOf(String str)
int lastIndexOf(String str, int fromIndex)
返回最右边出现的指定子字符串在此字符串中的索引  
也就是最后一个
可以指定索引
指定索引就从索引处 反向匹配
满足的条件也是startsWith true (并且在范围内 如果有设置)

获取子串

public 
String substring(int start, int end)
根据索引返回子串
public String substring(int start) substring(int start, int end)的简化方法
指定开始位置,默认结束位置为最后
public 
CharSequence subSequence(int start, int end)
为了实现CharSequence方法
内部调用的substring
 

更新方法

更新方法比较少,因为是数组
数组的访问按照下标进行设置就好了
还提供了替换的功能,也算是更新操作
AbstractStringBuilder replace(int start, int end, String str)
使用str替换对象中从start 开始到end结束的这一段 
 

删除方法

AbstractStringBuilder delete(int start, int end) 删除指定范围的char
AbstractStringBuilder deleteCharAt(int index)  删除某个位置的char
 
 

其他方法

reverse()
按照字符进行翻转
将此字符序列用其反转形式取代
就是翻转每一个char,注意可不是翻转比特位,也不是翻转字节,反转的是代码单元
不过对于辅助平面的字符的代码点,他们会按照字符进行翻转,也就是高代理低代理顺序不会改变
执行操作前未成对的低代理项和高代理项将成为代理项对
例如,反转 "\uDC00\uD800" 将生成有效的代理项对 "\uD800\uDC00"
 

总结

如同我们上面说的,AbstractStringBuilder就是  可变 字符序列的一个纲领
它规定了可变字符序列应该有的行为
比如 添加字符/删除字符/更新字符/获取字符
因为可变,所以对于可变的支持,自然是必不可少的
另外,他作为String在很多方面的一个替代,必然也是提供了String的一些功能方法
否则与String API 变化巨大 也是毫无意义
因为毕竟本身就是为了描述字符序列
所以对于AbstractStringBuilder  只需要彻底理解了他作为 可变字符序列的标准接口即可
 

基础数据类型之AbstractStringBuilder的更多相关文章

  1. [十三]基础数据类型之AbstractStringBuilder

      String内部是一个private final char value[]; 也就意味着每次调用的各种处理方法,返回的字符串都是一个新的,性能上,显然.... 所以,对于可变字符序列的需求是很明确 ...

  2. [.net 面向对象编程基础] (3) 基础中的基础——数据类型

    [.net 面向对象编程基础] (3) 基础中的基础——数据类型 关于数据类型,这是基础中的基础. 基础..基础..基础.基本功必须要扎实. 首先,从使用电脑开始,再到编程,电脑要存储数据,就要按类型 ...

  3. TypeScript学习指南第一章--基础数据类型(Basic Types)

    基础数据类型(Basic Types) 为了搭建应用程序,我们需要使用一些基础数据类型比如:numbers,strings,structures,boolean等等. 在TypeScript中除了Ja ...

  4. 【Swift】学习笔记(一)——熟知 基础数据类型,编码风格,元组,主张

    自从苹果宣布swift之后,我一直想了解,他一直没有能够把它的正式学习,从今天开始,我会用我的博客来驱动swift得知,据我们了解还快. 1.定义变量和常量 var  定义变量,let定义常量. 比如 ...

  5. 二、Windows基础数据类型

    六.Windows Data Types 简介: 6.1.这些数据类型都是C语言数据类型的再次的进行包装. 6.2.因为考虑到如果使用的是C中的基础数据类型可能无法表示,想表示的精准的含义. 6.3. ...

  6. java基础数据类型包装类

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  7. java.lang基础数据类型boolean、char、byte、short、int、long、float、double (JDK1.8)

    java.lang.Boolean public static int hashCode(boolean value) { return value ? 1231 : 1237; } JDK 1.8新 ...

  8. Python基础数据类型之列表和元组

    一.列表   list 列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如: li ...

  9. Python基础数据类型之字典

      基础数据类型之字典 ps:数据类型划分:可变数据类型和不可变数据类型. 不可变数据类型:元组(tupe).布尔值(bool).整数型(int).字符串(str).不可变数据类型也称为可哈希. 可变 ...

随机推荐

  1. Extjs gridPanel可复制配置(转)

    ExtJS默认是禁用了文本复制的功能,实际需求中可能需要能够复制,那么如何解决了,我在网上看到了许多解决办法,绝大部分都是从重写CSS样式或者重写gridView代码入手,我遇到这个问题的时候,我想作 ...

  2. 记录线上与本地docker镜像一致,但Dockerfile却构建失败的问题

    背景 公司新开了某个项目,我在新的服务器部署了docker环境,本着ctrl+c 和ctrl+v的惯例,直接把以前的php环境的Dockerfile文件直接复制到新项目服务器那里,结果构建失败,失败的 ...

  3. 【详解】WebSocket相关知识整理

    前言 记得大概半年前就产生了疑惑,即后台如何主动向前端推送数据.问了下专业老师,知道了原来有一个叫WebSocket的技术可以用于推送数据.于是,当时我就找了个教程,用的是Spring WebSock ...

  4. 使用shell脚本来自动化处理我们的工作,解放双手

    Shell脚本介绍 1.Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合. 2.Shell可以直接使用在wi ...

  5. Scala构建工具SBT

    SBT(Simple Build Tool)是Scala的项目构建工具,拥有依赖管理,构建过程管理和打包等功能. SBT官网上给出各平台的安装方法: MAC: 使用homebrew安装 brew in ...

  6. JS之BOM、DOM

    一.BOM对象 1,window对象 所有浏览器都支持window对象,从概念上讲:一个HTML文档对应一个window对象,从功能上讲:控制浏览器窗口的,从使用上讲:window对象不需要创建对象, ...

  7. RPA流程自动化-Blueprism认证考试介绍

    RPA流程自动化-Blueprism认证考试介绍 接触RPA有一段时间了,几种RPA相关工具也都试用过,BluePrism是RPA工具的一种,今天跟大家分享考Blueprism的一些经验. RPA(R ...

  8. 如何简单快速的修改Bootstrap

    Bootstrap并不是单单意味着HTML/CSS界面框架,更确切的说,它改变了整个游戏规则.这个囊括了应有尽有的代码框架使得许多应用和网站的设计开发变得简便许多,而且它将大量的HTML框架普及成了产 ...

  9. 解决SQL Server 2008安装时提示:重新启动计算机 失败

    a.重启机器,再进行安装,如果发现还有该错误,请按下面步骤: b.在开始->运行中输入regedit c.到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet ...

  10. sql 去掉 空格

    一.问题描述: 数据库中字段 nvarchar类型 存放数据如下: '3.3×10' 二.解决方案: --测试用例CREATE TABLE #temp(NAME NVARCHAR(20) null) ...