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',这里就存疑,有知道的小伙伴可以在评论中回复

    内容来自博客园,拒绝爬虫网站
  • 相关阅读:
    WSP部署错误—SharePoint管理框架中的对象“SPSolutionLanguagePack Name=0”依赖其他不存在的对象
    Elevate Permissions To Modify User Profile
    Error with Stsadm CommandObject reference not set to an instance of an object
    ASP.NET MVC3添加Controller时没有Scaffolding options
    测试使用Windows Live Writer写日志
    配置TFS 2010出现错误—SQL Server 登录的安全标识符(SID)与某个指定的域或工作组帐户冲突
    使用ADO.NET DbContext Generator出现错误—Unable to locate file
    CSS
    HTML DIV标签
    数据库
  • 原文地址:https://www.cnblogs.com/Heliner/p/10524897.html
Copyright © 2011-2022 走看看