zoukankan      html  css  js  c++  java
  • StringBudiler源码简单解析

    StringBudiler源码

    • 继承关系树
    • 底层实现
    • 默认容量()
    • 特别的添加方法(append)

    1、继承关系树

    继承自AbstractStringBuilder与StringBuffer同族

    2、底层实现

    //基本大部分方法都是调用父类的方法,点进父类查看
    public StringBuilder() {
        super(16);
    }
    

    AbstractStringBuilder.java

     AbstractStringBuilder(int capacity) {
            value = new char[capacity];
      }
    

    底层和String一样使用字符串实现,都是包装类型

    有参构造函数长度扩充为len+16;StringBuilder(CharSequence seq) {}同理

    public StringBuilder(String str) {
        super(str.length() + 16);
        append(str);
    }
    

    3、默认容量

    public StringBuilder() {
        super(16);
    }
    

    默认容量16

    使用有参构造器返回的容量为str.length()+16

    public StringBuilder(String str) {
        super(str.length() + 16);
        append(str);
    }
    

    4、添加方法

      @Override
        public StringBuilder append(String str) {
            super.append(str);
            return this;
        }
    //调用父类方法
    

    查看父类的方法

    public AbstractStringBuilder append(String str) {
        if (str == null)
            return appendNull();
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }
    
    1. 如果值为空,使用appendNull()是不是有个疑问,如果需要添加的值为空时不是直接返回当前StringBuilder就行了吗,为什么还要调用一个方法呢?

    appendNull()方法

    private AbstractStringBuilder appendNull() {
        int c = count;
        ensureCapacityInternal(c + 4);
        final char[] value = this.value;
        value[c++] = 'n';
        value[c++] = 'u';
        value[c++] = 'l';
        value[c++] = 'l';
        count = c;
        return this;
    }
    
    • 判断容量是否足够,如果不够通过Arrays.copy复制到新的字符串数组中然后将'null'添加到StringBuilder中

    回到append(String str)方法

    //扩容
    ensureCapacityInternal(count + len);
    //value为StringBuilder中实际拥有的char[],这里是讲str复制到value也就是StringBuilder里面去
    str.getChars(0, len, value, count);
    //变更实际长度
    count += len;
    
    return this;
    
    
    

    append(StringBuffer sb)方法

    public AbstractStringBuilder append(StringBuffer sb) {
        
    }
    

    来看一下使用append(String str)方法添加一个空字符串

    public static void main(String[] args) {
        
                StringBuilder sb = new StringBuilder();
                System.out.println("字符串第一个值:"+sb+"  ; 长度:"+sb.length());
                String str = null;
                sb.append(str);
                System.out.println("修改后:"+sb+"  ; 长度:"+sb.length());
        }
        
    

    测试结果:

    字符串第一个值: ; 长度:0
    修改后:null ; 长度

    至于为什么是添加'null',这里就存疑,有知道的小伙伴可以在评论中回复

    内容来自博客园,拒绝爬虫网站
  • 相关阅读:
    java语言程序设计与数据结构(基础版)第三章**3.4
    贪心练习:阿里巴巴与十四大盗————背包问题
    贪心练习最优装载问题
    贪心训练均分纸牌Noip2002
    排队打水问题(信息学奥赛一本通贪心算法)
    PAT甲题题解-1040. Longest Symmetric String (25)-求最长回文子串
    PAT甲题题解-1039. Course List for Student (25)-建立映射+vector
    PAT甲题题解-1038. Recover the Smallest Number (30)-排序/贪心,自定义cmp函数的强大啊!!!
    PAT甲题题解-1037. Magic Coupon (25)-贪心,水
    PAT甲题题解-1036. Boys vs Girls (25)-找最大最小,大水题
  • 原文地址:https://www.cnblogs.com/Heliner/p/10524897.html
Copyright © 2011-2022 走看看