java之AbstractStringBuilder类详解
|
AbstractStringBuilder类 |
|
位置:java.lang包中 |
|
声明: |
|
AbstractStringBuilder 类有abstract 修饰,可知它不能被实例化。 AbstractStringBuilder 类有两个子类:StringBuilder和StringBuffer。 |
|
字段 |
/** |
|
构造器 |
|
1、无参构造器 AbstractStringBuilder() {
|
|
2、创建abstractstringbuilder实现类的对象时指定缓冲区大小为capacity。 AbstractStringBuilder(int capacity) {
当子类StringBuilder或StringBuffer实例化时,会在构造器中调用此构造器。 |
|
扩充容量 |
|
void expandCapacity(int minimumCapacity) |
|
此方法有包访问权限,类中有多个方法会调用此方法,在容量不足时扩充容量。 |
|
源码: void expandCapacity(int minimumCapacity) {
将缓冲区长度加1乘2的值赋予变量newCapacity, 然后将此值与指定的值比较,将较大值确定为缓冲区的新容量;然后调用Arrays类的copyof方法,此方法会创建一个新数组,然后将原数组中的字符全部复制进新数组中。 |
|
ensureCapacity(int minimumCapacity) |
|
public void ensureCapacity(int minimumCapacity) |
|
确保容量至少等于指定的最小值。如果当前容量小于指定值,则创建新数组,新数组的容量为指定值的两倍加2;如果当前容量不小于指定值,则直接不做处理。 |
|
源码: public void ensureCapacity(int minimumCapacity) {
|
|
测试: StringBuffer s = new StringBuffer(); |
|
length() |
|
public int length() |
|
返回缓冲区中的代码单元数。 |
|
注意:此方法返回的并不是字符的数量,因为对于Unicode增补字符1个代码点对应2个代码单元。可以通过codePointCount方法获取字符数。 |
|
源码: public int length() {
|
|
Unicode标量值测试: StringBuffer s = new StringBuffer(); Unicode增补字符测试: StringBuffer s = new StringBuffer(); |
|
capacity() |
|
public int capacity() |
|
返回数组value的容量。 |
|
源码: public int capacity() {
|
|
测试: System.out.println(s.capacity());// |
|
反转 |
|
public AbstractStringBuilder reverse() |
|
将字符序列反转。 |
|
问题:我们知道对于Unicode 标量值只需要1个char变量即可表示,但对于增补字符却需要2个char变量,反转时如何正确的处理这些字符? 查看reverse源码: public AbstractStringBuilder reverse() {
可知此方法主要有两步: 1、用一个循环反转序列;并在每次循环时判断调换的两个字符是否有一个字符在\uD800和\uDFFF之间,如果有则置hasSurrogate的值为true。 2、若hasSurrogate的值为true,则进入第二个循环,调用Character类的isLowSurrogate和isHighSurrogate方法判断,将反转的增补字符再次反转,以此可确保字符的正确性。 |
|
添加 |
|||||
|
|||||
|
|||||
|
|||||
|
|||||
|
|||||
|
|||||
|
|||||
|
|||||
|
|||||
|
|||||
|
|||||
|
|||||
|
|
删除 |
|
public AbstractStringBuilder |
|
删除字符序列中从start开始,end结束的子序列。 |
|
插入 |
|||||
|
|||||
|
|||||
|
|||||
|
|||||
|
|||||
|
|||||
|
|||||
|
|||||
|
|||||
|
|||||
|
|||||
|
|
获取索引 |
|||||
|
|||||
|
|||||
|
|||||
|
|
替换 |
|
public AbstractStringBuilder replace(int start, int end, String str) |
|
用字符串str替换原字符序列中从start开始,end结束的子序列。 |
|
部分代码: if (end > count) |
|
获取子序列 |
||||
|
||||
|
||||
|
|
调整空间 |
|
public void trimToSize() |
|
试图减少字符序列的存储。如果缓冲区是大于必要的保持其当前的字符序列,然后可调整到更加节省空间。 |
|
源码: public void trimToSize() {
|
|
测试: StringBuffer sb = new StringBuffer("12345");
|
|
设置长度 |
|
public void setLength(int newLength) |
|
指定字符序列新长度为newLength。 |
|
源码: public void setLength(int newLength) {
|
|
测试: StringBuffer s = new StringBuffer("123456");
|
|
获取字符 |
|
public char charAt(int index) |
|
返回指定索引处的代码单元。 |
|
注意:此方法返回的并不一定是字符,因为对于Unicode增补字符1个代码点对应2个代码单元。 |
|
源码: public char charAt(int index) {
|
|
修改字符 |
|
public void setCharAt(int index, char ch) |
|
修改指定索引处(index)的代码单元为指定的代码单元(ch)。 |
|
源码: public void setCharAt(int index, char ch) {
|
|
删除字符 |
|
public AbstractStringBuilder deleteCharAt(int index) |
|
删除字符序列中指定索引处的代码单元。 |
|
源码: public AbstractStringBuilder deleteCharAt(int index) {
|
|
getChars |
|
public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) |
|
源数组value从srcBegin开始,srcEnd结束的字符序列依次覆盖目的数组dst中从dstBegin开始的连续(srcEnd - srcBegin)个代码单元。 |
|
注意:覆盖的字符序列不能越界。 |
|
源码: public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
|
|
测试1: StringBuffer s = new StringBuffer("123");
测试2: StringBuffer s = new StringBuffer("123");
打印: Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4 |
|
codePointAt(int index) |
|
public int codePointAt(int index) |
|
返回指定索引处的字符(Unicode code point)。 |
|
源码: public int codePointAt(int index) {
|
|
标量值测试: StringBuffer s = new StringBuffer(); 打印: 49 增补字符测试: StringBuffer s = new StringBuffer(); 打印: 65536 从测试中可以看出当字符序列中都是标量值字符时,直接输出对应的码点;当有增补字符时,那么,当索引指向的是高代理项时,就会输出整个增补字符的码点,当索引指向的是低代理项时,就会返回对应代码单元的码点。 |
|
codePointBefore(int index) |
|
public int codePointBefore(int index) |
|
返回指定索引前的字符(Unicode code point)。 |
|
部分源码: return Character.codePointBefore(value, index); |
|
标量值测试: StringBuffer s = new StringBuffer(); 打印: 49 增补字符测试: StringBuffer s = new StringBuffer(); 打印: 55296 从测试中可以看出当字符序列中都是标量值字符时,输出指定索引处的码点;当有增补字符时,那么,当索引指向的是高代理项时,就会输出对应代码单元的码点;当索引指向的是低代理项时,就会返回整个增补字符的码点。 |
|
codePointCount(int beginIndex, int endIndex) |
|
public int codePointCount(int beginIndex, int endIndex) |
|
返回在指定的文本范围的Unicode代码点的数量。 |
|
源码: public int codePointCount(int beginIndex, int endIndex) {
测试1: StringBuffer s = new StringBuffer("123123");
测试2: StringBuffer s = new StringBuffer(); 从测试中可知对于Unicode标量值1个代码点对应1个char,对于Unicode增补字符1个代码点对应2个char。 |
|
offsetByCodePoints(int index, int codePointOffset) |
|
public int offsetByCodePoints(int index, int codePointOffset) |
|
返回从给定的index处偏移codePointOffset个代码点的索引。 |
|
源码: public int offsetByCodePoints(int index, int codePointOffset) {
|
|
测试: StringBuffer s = new StringBuffer(); 打印: 1 |
|
appendCodePoint(int codePoint) |
|
public AbstractStringBuilder appendCodePoint(int codePoint) |
|
添加指定代码点对应的字符。 |
|
源码: public AbstractStringBuilder appendCodePoint(int codePoint) {
|
|
标量值测试: StringBuffer s = new StringBuffer(); 打印: 1 增补字符测试: StringBuffer s = new StringBuffer(); 打印:
|
相关链接:
java之AbstractStringBuilder类详解的更多相关文章
- java之StringBuffer类详解
StringBuffer 线程安全的可变字符序列. StringBuffer源码分析(JDK1.6): public final class StringBuffer extends Abstract ...
- java之StringBuilder类详解
StringBuilder 非线程安全的可变字符序列 .该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍).如果可能,建议优先采用该类,因为在 ...
- java.lang.Thread类详解
java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...
- Java中dimension类详解
Java中dimension类详解 https://blog.csdn.net/hrw1234567890/article/details/81217788
- java之Matcher类详解
在JDK 1.4中,Java增加了对正则表达式的支持. java与正则相关的工具主要在java.util.regex包中:此包中主要有两个类:Pattern.Matcher. Matcher 声明: ...
- java的ReentrantLock类详解
ReentrantLock 能用于更精细化的加锁的Java类, 通过它能更清楚了解Java的锁机制 ReentrantLock 类的集成关系有点复杂, 既有内部类, 还有多重继承关系 类的定义 pub ...
- Java的String类详解
Java的String类 String类是除了Java的基本类型之外用的最多的类, 甚至用的比基本类型还多. 同样jdk中对Java类也有很多的优化 类的定义 public final class S ...
- Java Properties工具类详解
1.Java Properties工具类位于java.util.Properties,该工具类的使用极其简单方便.首先该类是继承自 Hashtable<Object,Object> 这就奠 ...
- Java中ArrayList类详解
1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...
随机推荐
- 8个经典炫酷的HTML5 Canvas动画欣赏
HTML5非常强大,尤其是Canvas技术的应用,让HTML5几乎可以完成所有Flash能完成的效果.本文精选了8个经典炫酷的HTML5 Canvas动画欣赏,每一个都提供全部的源代码,希望对你有所帮 ...
- 多条件动态LINQ 组合查询
本文章转载:http://www.cnblogs.com/wangiqngpei557/archive/2013/02/05/2893096.html 参考:http://dotnet.9sssd.c ...
- js日期时间比较函数
转自:http://www.cnblogs.com/zxjyuan/archive/2010/09/07/1820708.html js日期比较(yyyy-mm-dd) function duibi( ...
- 现在看看自己写的博客,怎么感觉好low啊。。。
是不会写还是怎么着? 感觉比较好的东西,难以整理,就没往上放.... 现在猛一看,博客里的东西乱七八糟的...各位看官随便看看就好
- 解析表达式到lucene.net的Query
查询的时候有自己的查询格式,为了统一并且方便的搜索lucene.net 于是就写了个解析格式,大体上覆盖了几乎所有的lucene.net的query了.当然少了公共扩展库里包含的regexQuery, ...
- html5 自定义数据属性 ,也就是 data-* 自定义属性---笔记。
html5 自定义数据属性 ,也就是 data-* 自定义属性. 例如 <div data-last-value="43" data-hidden="true& ...
- 玩转spring boot——properties配置
前言 在以往的java开发中,程序员最怕大量的配置,是因为配置一多就不好统一管理,经常出现找不到配置的情况.而项目中,从开发测试环境到生产环境,往往需要切换不同的配置,如测试数据库连接换成生产数据库连 ...
- 斜堆(三)之 Java的实现
概要 前面分别通过C和C++实现了斜堆,本章给出斜堆的Java版本.还是那句老话,三种实现的原理一样,择其一了解即可. 目录1. 斜堆的介绍2. 斜堆的基本操作3. 斜堆的Java实现(完整源码)4. ...
- 免费素材下载:iOS 8 矢量 UI 素材套件
小伙伴们,苹果终于在今天凌晨推送了 iOS 8 的正式版.虽然该系统并未与 iPhone6 发布会同时亮相,但对于已经提前体验尝鲜过测试版的同学来说并不陌生.iOS 8 几乎每个图标都进行了重新设计, ...
- 对于Discuz!NT不允许新用户注册的解决办法
客户论坛用的是Discuz!NT,但是用户注册总是提示不允许新用户注册,对于这个问题,网上好多说的是管理员登录后台,在"用户与访问控制"里将允许新用户注册改为"是&quo ...
