String系列-----AbstractStringBuilder
1. AbstractStringBuilder是StringBuffer和StringBuilder的父类
package com.amazing.jdk.string_2017_12_31;
import java.util.Arrays;
public abstract class MyAbstractStringBuilder {
//用来存储字节
char[] value;
//字节的数量
int count;
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
/**
* 无参的构造方法
*/
MyAbstractStringBuilder(){}
/**
* 有参的构造方法
* @param capacity
* @return
*/
MyAbstractStringBuilder(int capacity){
value = new char[capacity];
}
/**
* 已存储字符长度
* @return
*/
public int length(){
return count;
}
/**
* 字符数组长度
* @return
*/
public int capacity(){
return value.length;
}
/**
* 确保不会数组下标越界
* length --->2*length+2 --->max_size---> Integer.Max
* @param minimumCapacity
*/
public void ensureCapacity(int minimumCapacity){
if(minimumCapacity>0){
//大于0
if(minimumCapacity-value.length>0){
//长度大于字符数组长度(容量不够),进行扩容
int newCapacity = (value.length*2)+2; //位运算 (value.length << 1) + 2;
if(newCapacity - minimumCapacity < 0){
//扩容两倍还是不够,就让数组长度等于传进来的数
newCapacity = minimumCapacity;
}
if(MAX_ARRAY_SIZE - minimumCapacity > 0){
value =Arrays.copyOf(value,newCapacity);
}else {
if(minimumCapacity>Integer.MAX_VALUE){
//超出内存错误
throw new OutOfMemoryError();
}
value=Arrays.copyOf(value,minimumCapacity);
}
}
}
}
/**
* 对应下标的字符
* @param index
* @return
*/
public char charAt(int index){
if(index<0 || index>=count){
throw new StringIndexOutOfBoundsException(index);
}
return value[index];
}
/**
* 追加:null
* @return
*/
public MyAbstractStringBuilder appendNull(){
int c=count;
ensureCapacity(c+4);
final char[] value=this.value;
value[c++] = 'n';
value[c++] = 'u';
value[c++] = 'l';
value[c++] = 'l';
count = c;
return this;
}
/**
* 追加内容 重写Appendable接口的方法
* @param c
* @return
*/
public MyAbstractStringBuilder append(char c){
ensureCapacity(count+1);
value[count++] = c;
return this;
} /**
* 字符串逆序输出
* @param str
* @return
*/
public String reverse(String str){
char[] charStr = str.toCharArray();
int len = str.length();
int n = len-1;
for (int j = (n-1) >> 1; j >= 0; j--) {
int k = n - j;
char cj = charStr[j];
char ck = charStr[k];
charStr[j] = ck;
charStr[k] = cj;
} return new String(charStr);
}
public abstract String toString(); //唯一的一个抽象方法:toString(),实现类重写该方法
final char[] getValue() { 唯一的一个final方法:getValue(),得到value数组。可以对其直接操作
return value;
}
}
2. 把一个字符串反转的方法:
public static String reverse1(String str){
return new StringBuffer(str).reverse().toString();
}
public static String reverse2(String str){
char[] charStr = str.toCharArray();//把字符串转成字符数组
String reverse = "";//空数组用来装反转之后的字符串
for(int i=charStr.length-1;i>=0;i--){ //倒序遍历
reverse+=charStr[i];
}
return reverse;
}
public static String reverse3(String str){
int len = str.length();
String reverse = "";
for (int i = 0; i <len ; i++) {
reverse = str.charAt(i)+reverse; //倒着加,没啥卵用(效率不会提高)
}
return reverse;
}
//注意理解这个算法
public static String reverse4(String str){
char[] charStr = str.toCharArray();
int len = str.length();
int n = len-1;
for (int j = (n-1) >> 1; j >= 0; j--) {
int k = n - j;
char cj = charStr[j];
char ck = charStr[k];
charStr[j] = ck;
charStr[k] = cj;
}
return new String(charStr);
}
3.注意:
AbstractStringBuilder的两者都是可变的,并且也定义了getValues方法让我们可以直接拿到value[],value实际上是个动态数组,和ArrayList的实现有很多相似的地方
注意和String的区别
4.该抽象类实现的接口
(1).CharSequence接口
public interface CharSequence{
int length(); //字符序列长度
char charAt(int index); //取得下标为index的字符
CharSequence subSequence(int start, int end); //得到该字符序列的一个子序列
public String toString(); //规定了该字符序列的String版本
}
实现这个接口的类都会重写这四个方法
(2).public interface Appendable{
Appendable append(char c) 向此 Appendable 添加指定字符。
Appendable append(CharSequence csq) 向此 Appendable 添加指定的字符序列。
Appendable append(CharSequence csq, int start, int end)向此 Appendable 添加指定字符序列的子序列。
}
Appendable接口:
Appendable接口的实现类的对象能够被添加 char 序列和值。(像IO里的类就实现了这个接口)
如果某个泪的实例打算接收取自Formatter的格式化输出,那么这个类必须实现Appendable接口,
格式化主要用在文本输出方面,比如:数字,日期,金额等。
String系列-----AbstractStringBuilder的更多相关文章
- String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)
本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...
- 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)
string.vector 互转 string 转 vector vector vcBuf;string stBuf("Hello DaMao!!!");----- ...
- Java String系列
String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1) StringBuilder 详解 (String ...
- String系列
String 简介 String 是java中的字符串,它继承于CharSequence.String类所包含的API接口非常多.为了便于今后的使用,我对String的API进行了分类,并都给出的演示 ...
- StringBuilder 详解 (String系列之2)
本章介绍StringBuilder以及它的API的详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string02.html StringB ...
- StringBuffer 详解 (String系列之3)
本章介绍StringBuffer以及它的API的详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string03.html StringBu ...
- String系列-----String
jdk源码学习之String,手动实现一个String package com.amazing.jdk.string_2017_12_31; import java.io.Serializable; ...
- 实战c++中的string系列--string与char*、const char *的转换(data() or c_str())
在project中,我们也有非常多时候用到string与char*之间的转换,这里有个一我们之前提到的函数 c_str(),看看这个原型: const char *c_str(); c_str()函数 ...
- 实战c++中的string系列--不要使用memset初始化string(一定别这么干)
參考链接: http://www.cppblog.com/qinqing1984/archive/2009/08/07/92479.html 百度百科第一次这么给力: void *memset(voi ...
随机推荐
- NSIS学习记录の----查找注册表某个键是否存在
最近要做一个注册表的判断.以往都是注册表某个键的键值存在查找,但是如何判断一个空键值的键是否存在呢(很多大厂装逼不写键值,有默认就好)? 下面给出解决办法(要沟通请邮件联系:7-7-2-7-0-6-5 ...
- Qt 编程指南 3_1 按钮弹窗手动和自动关联示例
触发的两种模式 connect() 和 on_控件ID_控件函数(参数) 两者优缺点对比: 虽然 Qt 有比较好用的自动关联大法,但自动关联不是万能的,尤其是涉及到多个窗体的时候,比如 A 窗体私有按 ...
- 转载 【.NET基础】--委托、事件、线程(1) https://www.cnblogs.com/chengzish/p/4559268.html
[.NET基础]--委托.事件.线程(1) 1,委托 是存放方法的指针的清单,也就是装方法的容器 A, 新建winform项目[01委托],项目中添加dg_SayHi.cs 委托类 用于存储方法 ...
- 淘宝可伸缩高性能互联网架构HSF(转)
文章转自http://blog.csdn.net/hpf911/article/details/14165865 时间过得很快,来淘宝已经两个月了,在这两个月的时间里,自己也感受颇深.下面就结合淘宝目 ...
- 贪心之oj.1797
1797:金银岛 查看 提交 统计 提问 总时间限制: 3000ms 内存限制: 65536kB 描述 某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品, ...
- 18核心的Intel i9将在2019年夏发布
受工艺和架构限制,Intel HEDT发烧级桌面平台面对AMD早已经优势不再,但升级仍然在继续. 去年10月份,Intel一方面发布了第二代酷睿i9 X系列,仍然基于14nm Skylake-X架构, ...
- HTML5中的execCommand命令
HTML5中的execCommand命令 在html5中,可以通过execCommand方法来运行一条命令,每一条命令都将对用户通过鼠标所选取的内容执行一些操作. 1. execCommand方法 浏 ...
- 【Codeforces 467D】Fedor and Essay
Codeforces 467 D 题意:给\(m\)个单词,以及\(n\)个置换关系,问将\(m\)个单词替换多次后其中所含的最少的\(R\)的数量以及满足这个数量的最短总长度 思路:首先将置 ...
- 学习CSS布局 - max-width
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- LVDS接口分类,时序,输出格式
LVDS接口分类,时序,输出格式 2016年01月19日 16:57:35 打个飞机去美国 阅读数:24673 标签: LVDS液晶屏格式时序 更多 个人分类: 硬件基础 1.1.1 ...