1. 1. AbstractStringBuilderStringBufferStringBuilder的父类
  1. package com.amazing.jdk.string_2017_12_31;
  2.  
  3. import java.util.Arrays;
  4.  
  5. public abstract class MyAbstractStringBuilder {
  6. //用来存储字节
  7. char[] value;
  8. //字节的数量
  9. int count;
  10.  
  11. private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
  12.  
  13. /**
  14. * 无参的构造方法
  15. */
  16. MyAbstractStringBuilder(){}
  17.  
  18. /**
  19. * 有参的构造方法
  20. * @param capacity
  21. * @return
  22. */
  23. MyAbstractStringBuilder(int capacity){
  24. value = new char[capacity];
  25. }
  26.  
  27. /**
  28. * 已存储字符长度
  29. * @return
  30. */
  31. public int length(){
  32. return count;
  33. }
  34.  
  35. /**
  36. * 字符数组长度
  37. * @return
  38. */
  39. public int capacity(){
  40. return value.length;
  41. }
  42.  
  43. /**
  44. * 确保不会数组下标越界
  45. * length --->2*length+2 --->max_size---> Integer.Max
  46. * @param minimumCapacity
  47. */
  48. public void ensureCapacity(int minimumCapacity){
  49. if(minimumCapacity>0){
  50. //大于0
  51. if(minimumCapacity-value.length>0){
  52. //长度大于字符数组长度(容量不够),进行扩容
  53. int newCapacity = (value.length*2)+2; //位运算 (value.length << 1) + 2;
  54. if(newCapacity - minimumCapacity < 0){
  55. //扩容两倍还是不够,就让数组长度等于传进来的数
  56. newCapacity = minimumCapacity;
  57. }
  58.  
  59. if(MAX_ARRAY_SIZE - minimumCapacity > 0){
  60.  
  61. value =Arrays.copyOf(value,newCapacity);
  62. }else {
  63. if(minimumCapacity>Integer.MAX_VALUE){
  64. //超出内存错误
  65. throw new OutOfMemoryError();
  66. }
  67. value=Arrays.copyOf(value,minimumCapacity);
  68.  
  69. }
  70.  
  71. }
  72.  
  73. }
  74. }
  75.  
  76. /**
  77. * 对应下标的字符
  78. * @param index
  79. * @return
  80. */
  81. public char charAt(int index){
  82. if(index<0 || index>=count){
  83. throw new StringIndexOutOfBoundsException(index);
  84. }
  85. return value[index];
  86.  
  87. }
  88.  
  89. /**
  90. * 追加:null
  91. * @return
  92. */
  93. public MyAbstractStringBuilder appendNull(){
  94. int c=count;
  95. ensureCapacity(c+4);
  96. final char[] value=this.value;
  97. value[c++] = 'n';
  98. value[c++] = 'u';
  99. value[c++] = 'l';
  100. value[c++] = 'l';
  101. count = c;
  102. return this;
  103. }
  1. /**
    * 追加内容 重写Appendable接口的方法
    * @param c
    * @return
    */
    public MyAbstractStringBuilder append(char c){
    ensureCapacity(count+1);
    value[count++] = c;
    return this;
    }
  2.  
  3. /**
    * 字符串逆序输出
    * @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;
    }
  4.  
  5. return new String(charStr);
    }
  1.   public abstract String toString(); //唯一的一个抽象方法:toString(),实现类重写该方法
  1.   final char[] getValue() { 唯一的一个final方法:getValue(),得到value数组。可以对其直接操作
    return value;
      }
    }

2. 把一个字符串反转的方法:

  1. public static String reverse1(String str){
  2. return new StringBuffer(str).reverse().toString();
  3. }
  4.  
  5. public static String reverse2(String str){
  6. char[] charStr = str.toCharArray();//把字符串转成字符数组
  7. String reverse = "";//空数组用来装反转之后的字符串
  8. for(int i=charStr.length-1;i>=0;i--){ //倒序遍历
  9. reverse+=charStr[i];
  10.  
  11. }
  12. return reverse;
  13. }
  14.  
  15. public static String reverse3(String str){
  16. int len = str.length();
  17. String reverse = "";
  18. for (int i = 0; i <len ; i++) {
  19. reverse = str.charAt(i)+reverse; //倒着加,没啥卵用(效率不会提高)
  20. }
  21. return reverse;
  22.  
  23. }

  24. //注意理解这个算法
  25. public static String reverse4(String str){
  26. char[] charStr = str.toCharArray();
  27. int len = str.length();
  28. int n = len-1;
  29. for (int j = (n-1) >> 1; j >= 0; j--) {
  30. int k = n - j;
  31. char cj = charStr[j];
  32. char ck = charStr[k];
  33. charStr[j] = ck;
  34. charStr[k] = cj;
  35.  
  36. }
  37.  
  38. return new String(charStr);
  39. }

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接口,
格式化主要用在文本输出方面,比如:数字,日期,金额等。

  1.  

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. cenos下安装MySQL最新版(5.7.18)记录。附卸载老版本过程

    首先说明:老版本数据库没有数据,所以无数据备份过程.如果你在升级数据库过程里,需要备份数据,请另外自行处理. 1.下载最新版MySQL.解压待用 wget https://dev.mysql.com/ ...

  2. DStream算子讲解(一)

    先把目录列好,方便有条理的进行整理

  3. CSS3之transition&transform

    参考网页: CSS3 transform 属性使用详解: http://www.renniaofei.com/code/css3-transform-shuxing-shiyong-xiangjie/ ...

  4. Mysql优化_慢查询开启说明及Mysql慢查询分析工具mysqldumpslow用法讲解

    Mysql优化_慢查询开启说明及Mysql慢查询分析工具mysqldumpslow用法讲解   Mysql慢查询开启 Mysql的查询讯日志是Mysql提供的一种日志记录,它用来记录在Mysql中响应 ...

  5. 转载 线程初步了解 - <第一篇>

    操作系统通过线程对程序的执行进行管理,当操作系统运行一个程序的时候,首先,操作系统将为这个准备运行的程序分配一个进程,以管理这个程序所需要的各种资源.在这些资源之中,会包含一个称为主线程的线程数据结构 ...

  6. cryptopunks的代码解释

    1.imageHash就是将punk所有图像合在一起的那张图punks.png进行hash得到一个值,并将该值存储到链上,用处就是你可以通过将图像hash然后跟该值对比看图像对不对.这就是它的用处,在 ...

  7. 【Codeforces 464D】World of Darkraft - 2

    Codeforces 464 D 首先我们知道这K个装备是互不干扰的,就是说如果一个装备升级了或者卖掉了,不会对其它装备的挣到的钱产生任何影响.所以我们就考虑单独处理某一个装备挣到的钱. 那么就设\( ...

  8. java Arrays数组

    1.java.util.Arrays 工具类的使用Arrays 类中的常用方法1) toString()打印数组2) equals()比较两个数组是否相同3) copyOf(…)复制指定的数组 (效率 ...

  9. 深度:Hadoop对Spark五大维度正面比拼报告!

    每年,市场上都会出现种种不同的数据管理规模.类型与速度表现的分布式系统.在这些系统中,Spark和hadoop是获得最大关注的两个.然而该怎么判断哪一款适合你? 如果想批处理流量数据,并将其导入HDF ...

  10. python 知识2

    零. type()函数怎么使用 type()的使用方法:type(对象)type()是接收一个对象当做参考,之后反回对象的相应类型.>>>type(1)<type 'int'& ...