博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
StringBuilder底层代码研究
阅读量:6094 次
发布时间:2019-06-20

本文共 1193 字,大约阅读时间需要 3 分钟。

之前看几个微博大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

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

 

转载于:https://www.cnblogs.com/blackdeng/p/7799593.html

你可能感兴趣的文章
关于Linux C编程问题 (struct sockaddr*)&addr 强制转换
查看>>
需求规格说明书
查看>>
SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现)。...
查看>>
Event based Collections
查看>>
例题1-1
查看>>
【leetcode】901. Online Stock Span
查看>>
创建oracle本地数据库步骤详解
查看>>
线段树入门
查看>>
【Android】在某一时间段控制Button是否可点击
查看>>
页面布局
查看>>
svnrdump:E175000:SSL is not supported错误的解决
查看>>
3月23日html(四) 格式与布局
查看>>
http协议
查看>>
《mac的git安装手册-1》
查看>>
MyBatis基础:MyBatis入门(1)
查看>>
nessus安装及使用
查看>>
AspNet GridView Excel 下载 Excel 导出
查看>>
cordova 源码分析记录
查看>>
04 企业的结构
查看>>
php 记录日志时 基础的日志格式
查看>>