基础数据类型之AbstractStringBuilder
|
类的层次结构设计,有的时候是自顶而下
有的时候是总结归纳,然后抽象出来一个新的类,这很正常
尽管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的更多相关文章
- [十三]基础数据类型之AbstractStringBuilder
String内部是一个private final char value[]; 也就意味着每次调用的各种处理方法,返回的字符串都是一个新的,性能上,显然.... 所以,对于可变字符序列的需求是很明确 ...
- [.net 面向对象编程基础] (3) 基础中的基础——数据类型
[.net 面向对象编程基础] (3) 基础中的基础——数据类型 关于数据类型,这是基础中的基础. 基础..基础..基础.基本功必须要扎实. 首先,从使用电脑开始,再到编程,电脑要存储数据,就要按类型 ...
- TypeScript学习指南第一章--基础数据类型(Basic Types)
基础数据类型(Basic Types) 为了搭建应用程序,我们需要使用一些基础数据类型比如:numbers,strings,structures,boolean等等. 在TypeScript中除了Ja ...
- 【Swift】学习笔记(一)——熟知 基础数据类型,编码风格,元组,主张
自从苹果宣布swift之后,我一直想了解,他一直没有能够把它的正式学习,从今天开始,我会用我的博客来驱动swift得知,据我们了解还快. 1.定义变量和常量 var 定义变量,let定义常量. 比如 ...
- 二、Windows基础数据类型
六.Windows Data Types 简介: 6.1.这些数据类型都是C语言数据类型的再次的进行包装. 6.2.因为考虑到如果使用的是C中的基础数据类型可能无法表示,想表示的精准的含义. 6.3. ...
- java基础数据类型包装类
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- 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新 ...
- Python基础数据类型之列表和元组
一.列表 list 列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如: li ...
- Python基础数据类型之字典
基础数据类型之字典 ps:数据类型划分:可变数据类型和不可变数据类型. 不可变数据类型:元组(tupe).布尔值(bool).整数型(int).字符串(str).不可变数据类型也称为可哈希. 可变 ...
随机推荐
- [Vijos 1676] 陶陶吃苹果
Description curimit知道陶陶很喜欢吃苹果.于是curimit准备在陶陶生日的时候送给他一棵苹果树. curimit准备了一棵这样的苹果树作为生日礼物:这棵苹果树有n个节点,每个节点上 ...
- cJSON填坑记
1. 艰辛的过程 最近做了一个嵌入式的项目,需要与服务器进行连接.为了方便服务器处理数据,经商定后统一采用JSON形式进行数据的传输. 以前没有用过JSON格式进行数据处理,所以上网搜索了一下,很多人 ...
- Asp.Net4.5 mvc4(二) 页面创建与讲解
一.Contorl 通过目录结构我们可以看到contorllers类的命名方式 命名规则:前缀+Controller. 在看看contorller中的action方法 using System; us ...
- win10 uwp 如何开始写 uwp 程序
本文告诉大家如何创建一个 UWP 程序. 这是一系列的 uwp 入门博客,所以写的很简单 本文来告诉大家如何创建一个简单的程序 安装 VisualStudio 在开始写 UWP 需要安装 Visual ...
- [PHP] 算法-数组中出现次数超过一半的数字的PHP实现
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在 ...
- Callable接口--有返回值的线程
Callable java5之前是没有返回值的,Java5新增了Callable接口获得线程的返回值,可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口.Cal ...
- 【代码笔记】Web-ionic tab(选项卡)
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 【读书笔记】iOS-xib,自动布局(二)
我们紧接着上面的文章来写. 一,此时没有选择自动布局的时候 . 二,选中Use Auto Layout.如下图所示. 三,自动布局与不自动布局最明显的区别是右下角多了4个按钮.如图所示. 四,设置On ...
- mysql 之库, 表的简易操作
一. 库的操作 1.创建数据库 创建数据库: create database 库名 charset utf8; charset uft8 可选项 1.2 数据库命名规范: 可以由字母.数字.下划 ...
- React 入门学习笔记整理(八)—— todoList
APP.js import React, { Component,createRef,Fragment} from 'react'; import Todos from './components/t ...












