美文网首页
3.AbstractStringBuilder

3.AbstractStringBuilder

作者: 木有鱼丸啦 | 来源:发表于2019-06-25 11:21 被阅读0次

    实现了Appendable和CharSequence

    implements Appendable, CharSequence
    
    1.codePointCount(int beginIndex, int endIndex)
        public int codePointCount(int beginIndex, int endIndex) {
            if (beginIndex < 0 || endIndex > count || beginIndex > endIndex) {
                throw new IndexOutOfBoundsException();
            }
            return Character.codePointCountImpl(value, beginIndex, endIndex-beginIndex);
        }
    

    String.length() 返回字符串所使用的代码单元个数,或者说返回字符串占用的char类型数据个数。String.codePointCount() 则返回字符串的码点个数,一个字符对应一个码点,所以该方法可以真正返回字符串当中的字符个数。length()方法和codePointCount()方法在某些情况下返回值相等,即字符串当中字符都是常见字符时(码点小于等于0xFFFF)

    2.append(String str)
     public AbstractStringBuilder append(String str) {
            if (str == null)
                return appendNull();
            int len = str.length();
            ensureCapacityInternal(count + len);//扩容
            str.getChars(0, len, value, count);//复制追加str
            count += len;//增加长度
            return this;
        }
    
        private void ensureCapacityInternal(int minimumCapacity) {
            // overflow-conscious code
            if (minimumCapacity - value.length > 0) {//如果新值长度minimumCapacity大于当前数组长度,就new 一个更大的数组,并拷贝值
                value = Arrays.copyOf(value,
                        newCapacity(minimumCapacity));
            }
        }
    
      private int newCapacity(int minCapacity) {//fan
            // overflow-conscious code
            int newCapacity = (value.length << 1) + 2;
            if (newCapacity - minCapacity < 0) {
                newCapacity = minCapacity;
            }
            return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
                ? hugeCapacity(minCapacity)
                : newCapacity;
        }
    
        private int hugeCapacity(int minCapacity) {
            if (Integer.MAX_VALUE - minCapacity < 0) { // overflow
                throw new OutOfMemoryError();
            }
            return (minCapacity > MAX_ARRAY_SIZE)
                ? minCapacity : MAX_ARRAY_SIZE;
        }
    
    3.getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

    srcBegin -- 字符串中要复制的第一个字符的索引。

    srcEnd -- 字符串中要复制的最后一个字符之后的索引。

    dst -- 目标数组。

    dstBegin -- 目标数组中的起始偏移量。

        public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
        {
            if (srcBegin < 0)
                throw new StringIndexOutOfBoundsException(srcBegin);
            if ((srcEnd < 0) || (srcEnd > count))
                throw new StringIndexOutOfBoundsException(srcEnd);
            if (srcBegin > srcEnd)
                throw new StringIndexOutOfBoundsException("srcBegin > srcEnd");
            System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
        }
    
     public static void main(String args[]) {
            String Str1 = new String("www.runoob.com");
            char[] Str2 = new char[6];
    
            try {
                Str1.getChars(4, 10, Str2, 0);
                System.out.print("拷贝的字符串为:" );
                System.out.println(Str2 );
            } catch( Exception ex) {
                System.out.println("触发异常...");
            }
        }
    拷贝的字符串为:runoob
    
    4.arraycopy(很多字符修改拷贝的操作都是调用这个方法)

    src 原对象
    srcPos 原对象复制的起始位置
    dest 目标对象
    destPos 目标对象替换的起始位置
    length 替换的长度

       public static native void arraycopy(Object src,  int  srcPos,
                                            Object dest, int destPos,
                                            int length);
    
     public static void main(String args[]) {
            char[] c1 = new String("123456").toCharArray();
            char[] c2 = new String("abcdef").toCharArray();
            System.arraycopy(c1,1 , c2, 1, 2);
            for(char c : c1){
                System.out.print(c);
            }
            System.out.println();
            for(char c : c2){
                System.out.print(c);
            }
    
        }
    输出
    123456
    a23def
    
    5.reverse()

    将内容全部反转

     public AbstractStringBuilder reverse() {
            boolean hasSurrogates = false;
            int n = count - 1;
            for (int j = (n-1) >> 1; j >= 0; j--) {
                int k = n - j;
                char cj = value[j];
                char ck = value[k];
                value[j] = ck;
                value[k] = cj;
                if (Character.isSurrogate(cj) ||
                    Character.isSurrogate(ck)) {
                    hasSurrogates = true;
                }
            }
            if (hasSurrogates) {
                reverseAllValidSurrogatePairs();
            }
            return this;
        }
    
      /** Outlined helper method for reverse() */
        private void reverseAllValidSurrogatePairs() {
            for (int i = 0; i < count - 1; i++) {
                char c2 = value[i];
                if (Character.isLowSurrogate(c2)) {
                    char c1 = value[i + 1];
                    if (Character.isHighSurrogate(c1)) {
                        value[i++] = c1;
                        value[i] = c2;
                    }
                }
            }
        }
    

    相关文章

      网友评论

          本文标题:3.AbstractStringBuilder

          本文链接:https://www.haomeiwen.com/subject/oyozqctx.html