zoukankan      html  css  js  c++  java
  • StringBuilder底层代码研究

    之前看几个微博大V讨论String拼接效率问题。今天好不容易闲下来就看了看StringBuilder的底层拼接到底怎么回事。

    java 版本是1.6版

    通过StringBuilder追踪到上层抽象类:AbstractStringBuilder,

    String保存在AbstractStringBuilder中是一个名为【value】的char类型数组

    然后查看了抽象类的append方法

    public AbstractStringBuilder append(String str) {
        //校验
        if (str == null) 
            str = "null";
        int len = str.length();
        if (len == 0)
            return this;
        
        //新长度
        int newCount = count + len;
        
        //确定是否需要给当前的value扩容
        if (newCount > value.length)
            expandCapacity(newCount);
        
        //把字符串转化为char[]。然后增加到value后方
        str.getChars(0, len, value, count);
        count = newCount;
        return this;
        }
        
        
    void expandCapacity(int minimumCapacity) {
            //自动构造长度为两倍当前长度
            int newCapacity = (value.length + 1) * 2;
            //如果自动构造长度超长则只能取最大Integer长度
            if (newCapacity < 0) {
                newCapacity = Integer.MAX_VALUE;
            //如果新长度大于自动构造长度那么构造长度为新长度
            } else if (minimumCapacity > newCapacity) {
            newCapacity = minimumCapacity;
            }
            //字符串相关数组扩容
            value = Arrays.copyOf(value, newCapacity);
        }

    这里可以看出拼接字符串实际上是字符数组的扩容与拷贝。

    而且每次调用一次字符容量最起码就会在当前基础上翻倍。

    即:n*2的次方。直到长度达到2147483647

    所以如何合理拼接字符串呢?

  • 相关阅读:
    软件工程结对作业02
    最大子数组和
    四则运算2单元测试
    软件工程个人作业03
    梦断代码阅读笔记01
    最大值的单元测试
    构建之法阅读笔记01
    进度条记录02
    软件工程个人作业02
    【BZOJ2595_洛谷4294】[WC2008]游览计划(斯坦纳树_状压DP)
  • 原文地址:https://www.cnblogs.com/blackdeng/p/7799593.html
Copyright © 2011-2022 走看看