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

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

  • 相关阅读:
    要开学了,暂时停更
    day13 IP包头分析 | 路由器原理 1
    day12 数据链路层 | 交换机基本命令
    day11 OSI与TCP-IP 5层协议 | 物理层相关知识
    day10 扫描与爆破
    day 09 简单渗透测试
    day07 PKI
    day07 域
    day06 WEB服务器 | FTP服务器
    day05 DHCP部署与安全 | DNS部署与安全
  • 原文地址:https://www.cnblogs.com/blackdeng/p/7799593.html
Copyright © 2011-2022 走看看