zoukankan      html  css  js  c++  java
  • StringBuild使用与原理

    StringBuild的使用:

    1、创建:

    StringBuilder sb=new StringBuilder();

    StringBuilder sb=new StringBuilder(200);
    sb.append("Hello");
    sb.append(" World!");
    System.out.println(sb.toString());

    // 输出结果:Hello World!

    这个是StringBuild最常用的用法,把需要拼接的字符串拼接使用append(String str)放入StringBuild对象中,然后就可以进行拼接。最后使用toString()方法进行转换就可以了。

    2、

    在java中,字符创是不可变的,每一次的字符串都是新的值,因此,在需要对字符串进行拼接操作的时候,我们是使用StringBuild,那么,为什么StringBuild可以呢?

    看源码:

    因此,StringBuild是继承自AbstractStringBuilder的。

    abstract class AbstractStringBuilder implements Appendable, CharSequence {
        /**
         * The value is used for character storage.
         */
        char[] value;
    
        /**
         * The count is the number of characters used.
         */
        int count;
    
        。。。  
    }
    

      可以看出,AbstractStringBuilder里面有两个变量value和count,这两个是关键,为什么是关键我们接着往下看:

    看StringBuild我们最常用的append()方法:

       @Override
        public StringBuilder append(Object obj) {
            return append(String.valueOf(obj));
        }
    
        @Override
        public StringBuilder append(String str) {
            super.append(str);
            return this;
        }
    

      最后调用到基类,也就是AbstractStringBuilder 的方法里去了,,那么我们再看AbstractStringBuilder 中的append()方法。

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

    先看前两行,判断是不是空的,如果是空的就执行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;
        }
    

      可见,操作是把长度count也增加4,把value增加null的四个字符,然后返回this,也就是说把null放入了AbstractStringBuilder的value中,value是一个char[]数组。而count指的正是count的值。

    而看append()方法的后半段,则是先扩宽value数组的长度,然后调用String的getChars方法把传入的字符串放入value数组中,之后再增加count的长度。

    因此,再toString()

    之前,StringBuild的append操作实际上是把str变成了char数组存入了变量value中。那么toString()操作呢?

        @Override
        public String toString() {
            // Create a copy, don't share the array
            return new String(value, 0, count);
        }
    

      可见,是调用了String的构造方法,把chae数组value变成了String类型返回。这个就是StringBuild的实质。

  • 相关阅读:
    B1005 继续(3n+1)猜想 (25分)
    B1091 N-自守数 (15分)
    B1086 就不告诉你 (15分)
    B1081 检查密码 (15分)
    个人博客作业Week1
    2015个人项目(修改除法要求)
    2014个人博客列表
    最佳个人博客、团队博客评分
    最终评审时间确定
    最终复审要求
  • 原文地址:https://www.cnblogs.com/heisehenbai/p/7739924.html
Copyright © 2011-2022 走看看