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的更多相关文章

  1. String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)

    本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...

  2. 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

    string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----- ...

  3. Java String系列

    String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1) StringBuilder 详解 (String ...

  4. String系列

    String 简介 String 是java中的字符串,它继承于CharSequence.String类所包含的API接口非常多.为了便于今后的使用,我对String的API进行了分类,并都给出的演示 ...

  5. StringBuilder 详解 (String系列之2)

    本章介绍StringBuilder以及它的API的详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string02.html StringB ...

  6. StringBuffer 详解 (String系列之3)

    本章介绍StringBuffer以及它的API的详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string03.html StringBu ...

  7. String系列-----String

    jdk源码学习之String,手动实现一个String package com.amazing.jdk.string_2017_12_31; import java.io.Serializable; ...

  8. 实战c++中的string系列--string与char*、const char *的转换(data() or c_str())

    在project中,我们也有非常多时候用到string与char*之间的转换,这里有个一我们之前提到的函数 c_str(),看看这个原型: const char *c_str(); c_str()函数 ...

  9. 实战c++中的string系列--不要使用memset初始化string(一定别这么干)

    參考链接: http://www.cppblog.com/qinqing1984/archive/2009/08/07/92479.html 百度百科第一次这么给力: void *memset(voi ...

随机推荐

  1. linux之基本命令进阶

    一  配置yum源管理与软件管理  yum常见工具 tree telent sl  cowsay yum install tree #安装tree命令,以树形目录显示 #由于每次安装都有确认的提示,取 ...

  2. CF1045G:AI robots(CDQ分治)

    Description 火星上有$n$个机器人排成一行,第$i$个机器人的位置为$x_i$,视野为$r_i​$,智商为$q_i​$.我们认为第$i$个机器人可以看到的位置是$[x_i−r_i,x_i+ ...

  3. 对JavaScript垃圾回收机制的理解?

    (1)标记清除(Mark and sweep) 这是JavaScript最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为”进入环境”,当变量离开环境的时候( ...

  4. MP实战系列(四)之DAO讲解

    说到DAO不得不提一个开发名词"三层架构",所谓的三层架构是什么呢?简单的可以概括为数据访问层,业务逻辑层,界面层(又称表现层). 这也是我们Java开发常用的手段,经常有人将三层 ...

  5. 3386 二分图 洛谷luogu [模版]

    题目背景 二分图 感谢@一扶苏一 提供的hack数据 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两 ...

  6. node.js 基础二 开启服务器监听

    1.server.js 2.监听 一 server.js 二 监听 运行server.js后,浏览器打开:http://localhost:8888/ //====================== ...

  7. 【Codeforces Round 1120】Technocup 2019 Final Round (Div. 1)

    Codeforces Round 1120 这场比赛做了\(A\).\(C\)两题,排名\(73\). \(A\)题其实过的有点莫名其妙...就是我感觉好像能找到一个反例(现在发现我的算法是对的... ...

  8. IntelliJ IDEA 常用设置 (二)

    一. 代码提示和补充功能有一个特性:区分大小写. 区分大小写的情况是这样的:比如我们在 Java 代码文件中输入 stringBuffer IntelliJ IDEA 是不会帮我们提示或是代码补充的, ...

  9. virtualbox - 2台虚拟机之间通过ssh互访

    virtualbox 5.2.12 一台虚拟机是Debian 9,另一台是Ubuntu 18.04. 注意: 2台虚拟机系统里要安装ssh ! sudo apt install ssh 然后在virt ...

  10. 【第196期】Drupal7 Features模块与 Drupal8 Configuration Management 模块对比

    Drupal 8 最好和最受欢迎的部分之一是新的配置管理系统. 该系统使开发人员很容易将配置导出到代码中.在此之前,开发人员不得不依赖于由Features.Strongarm.UUID.Feature ...