码迷,mamicode.com
首页 > 其他好文 > 详细

String系列-----AbstractStringBuilder

时间:2018-03-09 01:46:17      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:stat   span   UI   except   下标   har   ack   com   buffer   

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];

    }

    /**
     * 追加字符串
     * @param str
     * @return
     */
    public MyAbstractStringBuilder append(String str){
        if(str==null){
            return appendNull();
        }
        int len = str.length();
        ensureCapacity(count+len);
        //长度变化
        count = count+len;
        return this;
    }

    /**
     * 追加: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;
    }


}

 

 

String系列-----AbstractStringBuilder

标签:stat   span   UI   except   下标   har   ack   com   buffer   

原文地址:https://www.cnblogs.com/inspred/p/8531508.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!