android StringBuilder的Capacity的使用
今天,简单讲讲android里如何使用StringBuilder的Capacity属性。
这个其实也很简单,之前我写个关于list的Capacity属性的博客,说到了list的size和Capacity是不一样的。同样,StringBuilder的字符串的长度Length属性和分配的空间Capacity属性也是不一样的。
StringBuilder 类表示可变字符的字符串。
名称 |
说明 |
Capacity属性 |
获取或设置可包含在当前实例所分配的内存中的最大字符数 |
Length属性 |
获取或设置当前 StringBuilder 对象的长度 |
StringBuilder 类Capacity属性的默认值为16。
StringBuilder sb = new StringBuilder();
Console.WriteLine("Length属性:" + sb.Length + "Capacity属性:" + sb.Capacity);
Console.ReadLine();
当StringBuilder 对象的Length属性值超过Capacity属性的长度时,StringBuilder 对象内部会重新构造一个字符数组。Capacity属性会变为以前的2倍。例如:Capacity属性的默认值为16,当追加字符串的长度超过16时,Capacity属性会扩充为32。
StringBuilder sb = new StringBuilder();
//追加长度为17的字符串
sb.Append("01234567890123456");
Console.WriteLine("Length属性:" + sb.Length + " Capacity属性:" + sb.Capacity);
Console.ReadLine();
所以为了节省空间的浪费,最好在使用时指定初始化的大小。接下来看看android的源码:
指定初始容量
先来看一下StringBuilder的源码(JDK7)
public final class StringBuilderextends AbstractStringBuilderimplements java.io.Serializable, CharSequence
{/** use serialVersionUID for interoperability */static final long serialVersionUID = 4383685877147921099L;/*** Constructs a string builder with no characters in it and an* initial capacity of 16 characters.*/public StringBuilder() {super(16);}/*** Constructs a string builder with no characters in it and an* initial capacity specified by the <code>capacity</code> argument.** @param capacity the initial capacity.* @throws NegativeArraySizeException if the <code>capacity</code>* argument is less than <code>0</code>.*/public StringBuilder(int capacity) {super(capacity);}
}
StringBuilder的默认构造方法调用的是父类AbstractStringBuilder 中的AbstractStringBuilder(int capacity)构造方法,如下:
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;/*** This no-arg constructor is necessary for serialization of subclasses.*/AbstractStringBuilder() {}/*** Creates an AbstractStringBuilder of the specified capacity.*/AbstractStringBuilder(int capacity) {value = new char[capacity];}
}
StringBuilder的内部有一个char[], 在调用StringBuilder的无参构造方法时其内部char[]的默认长度是16。当我们调用StringBuilder的append方法时,其实就是不断的往char[]里填东西的过程。
public StringBuilder append(String str) {super.append(str);return this;
}
其中,super.append是调用AbstractStringBuilder 的append(String str)方法,如下:
public AbstractStringBuilder append(String str) {if (str == null) str = "null";int len = str.length();ensureCapacityInternal(count + len);str.getChars(0, len, value, count);count += len;return this;
}
StringBuilder的扩容和ArrayList有些类似,具体代码如下:
/*** This method has the same contract as ensureCapacity, but is* never synchronized.*/
private void ensureCapacityInternal(int minimumCapacity) {// overflow-conscious codeif (minimumCapacity - value.length > 0)expandCapacity(minimumCapacity);
}/*** This implements the expansion semantics of ensureCapacity with no* size check or synchronization.*/
void expandCapacity(int minimumCapacity) {int newCapacity = value.length * 2 + 2;if (newCapacity - minimumCapacity < 0)newCapacity = minimumCapacity;if (newCapacity < 0) {if (minimumCapacity < 0) // overflowthrow new OutOfMemoryError();newCapacity = Integer.MAX_VALUE;}value = Arrays.copyOf(value, newCapacity);
}
StringBuilder默认长度是16,然后,如果要append第17个字符,怎么办?
答案是采用 Arrays.copyOf()成倍复制扩容!
扩容的性能代价是很严重的:一来有数组拷贝的成本,二来原来的char[]也白白浪费了要被GC掉。可以想见,一个129字符长度的字符串,经过了16,32,64, 128四次的复制和丢弃,合共申请了496字符的数组,在高性能场景下,这几乎不能忍。
由此可见,合理设置一个初始值多重要。使用之前先仔细评估一下要保存的字符串最大长度。
简单讲讲,就是StringBuilder在创建时内部分配了一个长度为16的字符数组,每次调用append时,会首先比较新的字符长度与内部数组的大小,如果大于就会进行扩容,扩容的方式是每次是原来容量的2倍。扩容后会将老的数据复制到新的字符数组里,然后将append(sb)里的数据考到新的字符数组里。所以这个是浪费了时间和内存的。所以在知道StringBuilde需要r的最大长度时,最好在使用前就指定初始化的容量Capacity。StringBuffer与StringBuilder都是继承于AbstractStringBuilder,唯一的区别就是StringBuffer的函数上都有synchronized关键字。
android StringBuilder的Capacity的使用就讲完了。
就这么简单。
android StringBuilder的Capacity的使用相关推荐
- android stringbuilder 一次插入多条数据_android开发面试题解析
俗话说职场如战场,选择好的阵容去"投靠"这一点至关重要,但是这也是需要技术的.我想在三国中最早的面试应该就是"三顾茅庐"了,典故的细节就不说了,面试的难只有我们 ...
- android stringbuilder清空,StringBuffer 清空StringBuffer的实例的三种方法
@Test public void testStringbuffer(){ //StringBuffer类没有clear方法,不过可以通过下面两种方法来清空一个StringBuffer的实例: Str ...
- android stringbuilder清空,StringBuilder
從目前的 StringBuilder 執行個體移除所有字元.Removes all characters from the current StringBuilder instance. public ...
- android stringbuilder 清空,java stringbuilder清空的方法
java stringbuilder清空的三种方法 1.新生成一个,旧的由系统自动回收 2.delete 方法 builder1.delete(0, builder.length()); 3.Leng ...
- String,StringBuffer,StringBuilder三者的异同
String,StringBuffer,StringBuilder三者的异同:? String:不可变的字符序列;底层使用char[]存储(用final修饰) StringBuffer:可变的字符序列 ...
- StringBuilder与String互转
StringBuilder类是一个可变的字符序列. StringBuilder() 构造一个不带任何字符的字符串生成器,其初始容量为 16 个字符. StringBuilder( ...
- StringBuilder详解
1.简介 StringBuilder和StringBuffer一样,都是继承自抽象类AbstractStringBuilder类,也是一个可变的字符序列.StringBuilder和StringBuf ...
- 你必须搞清楚的String,StringBuilder,StringBuffer
String,StringBuilder 以及 StringBuffer 这三个类的关系与区别一直是 Java 的经典问题,这次就来讲一下关于这三个类的一些知识 一. 简单对比 String : 字符 ...
- StringBuilder初始化容量以及扩容机制(源码分析)
我们从源码来分析一下StringBuilder的底层原理: /*** Constructs a string builder with no characters in it and an* init ...
最新文章
- 保障数据安全,强调科技向善,旷视发布《人工智能应用准则》
- Unix Domain Socket 域套接字实现
- 《Oracle数据库管理与维护实战》——2.11 Oracle数据字典
- 零基础如何学爬虫技术?
- unbutu安装搜狗输入法【转载】
- 风机桨叶故障诊断(六) 利用自编码器进行特征学习
- PLY——Python Lex Yacc
- 电脑桌面数字时钟c语言,DesktopDigitalClock(桌面数字时钟)
- 高等数学张宇18讲 第五讲 中值定理
- 方差公式Var(x)=E(x^2)-[E(x)]^2,求期望值
- win10专业版激活工具很不错!
- dns和私人dns是什么意思?企业如何预防dns劫持?
- 如何搭建Hadoop分布式环境?我来教你怎么做![内含测试小案例]
- 图解“华为云潮汕火锅”的“牛里乾坤”
- 真实的上海IT圈:张江男vs漕河泾男
- java开源saas项目
- ACL-BioNLP 2020 | 耶鲁大学实践成果:生物医药知识图谱嵌入模型基准测试
- 「敏捷模型」敏捷架构:规模化敏捷开发的策略
- Websocket 可以玩出些什么花儿?
- 酷狗与鸿蒙系统,酷狗音乐鸿蒙版app
热门文章
- 工业4.0的小小思考
- 文件上传与下载问题记录
- 前端含金量较高的网站推荐
- uwp选取文件夹并读取其中的图片
- [记录]java.math.biginteger cannot be cast to java.lang.long
- [转]Oracle Client 11g安裝經驗
- Android开发探秘之三:利用jsoup解析HTML页面
- Android多线程源码学习笔记一:handler、looper、message、messageQueue
- day08 MapReduce
- easyUI的combobox设置隐藏和显示