今天,简单讲讲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的使用相关推荐

  1. android stringbuilder 一次插入多条数据_android开发面试题解析

    俗话说职场如战场,选择好的阵容去"投靠"这一点至关重要,但是这也是需要技术的.我想在三国中最早的面试应该就是"三顾茅庐"了,典故的细节就不说了,面试的难只有我们 ...

  2. android stringbuilder清空,StringBuffer 清空StringBuffer的实例的三种方法

    @Test public void testStringbuffer(){ //StringBuffer类没有clear方法,不过可以通过下面两种方法来清空一个StringBuffer的实例: Str ...

  3. android stringbuilder清空,StringBuilder

    從目前的 StringBuilder 執行個體移除所有字元.Removes all characters from the current StringBuilder instance. public ...

  4. android stringbuilder 清空,java stringbuilder清空的方法

    java stringbuilder清空的三种方法 1.新生成一个,旧的由系统自动回收 2.delete 方法 builder1.delete(0, builder.length()); 3.Leng ...

  5. String,StringBuffer,StringBuilder三者的异同

    String,StringBuffer,StringBuilder三者的异同:? String:不可变的字符序列;底层使用char[]存储(用final修饰) StringBuffer:可变的字符序列 ...

  6. StringBuilder与String互转

    StringBuilder类是一个可变的字符序列. StringBuilder()            构造一个不带任何字符的字符串生成器,其初始容量为 16 个字符. StringBuilder( ...

  7. StringBuilder详解

    1.简介 StringBuilder和StringBuffer一样,都是继承自抽象类AbstractStringBuilder类,也是一个可变的字符序列.StringBuilder和StringBuf ...

  8. 你必须搞清楚的String,StringBuilder,StringBuffer

    String,StringBuilder 以及 StringBuffer 这三个类的关系与区别一直是 Java 的经典问题,这次就来讲一下关于这三个类的一些知识 一. 简单对比 String : 字符 ...

  9. StringBuilder初始化容量以及扩容机制(源码分析)

    我们从源码来分析一下StringBuilder的底层原理: /*** Constructs a string builder with no characters in it and an* init ...

最新文章

  1. 保障数据安全,强调科技向善,旷视发布《人工智能应用准则》
  2. Unix Domain Socket 域套接字实现
  3. 《Oracle数据库管理与维护实战》——2.11 Oracle数据字典
  4. 零基础如何学爬虫技术?
  5. unbutu安装搜狗输入法【转载】
  6. 风机桨叶故障诊断(六) 利用自编码器进行特征学习
  7. PLY——Python Lex Yacc
  8. 电脑桌面数字时钟c语言,DesktopDigitalClock(桌面数字时钟)
  9. 高等数学张宇18讲 第五讲 中值定理
  10. 方差公式Var(x)=E(x^2)-[E(x)]^2,求期望值
  11. win10专业版激活工具很不错!
  12. dns和私人dns是什么意思?企业如何预防dns劫持?
  13. 如何搭建Hadoop分布式环境?我来教你怎么做![内含测试小案例]
  14. 图解“华为云潮汕火锅”的“牛里乾坤”
  15. 真实的上海IT圈:张江男vs漕河泾男
  16. java开源saas项目
  17. ACL-BioNLP 2020 | 耶鲁大学实践成果:生物医药知识图谱嵌入模型基准测试
  18. 「敏捷模型」敏捷架构:规模化敏捷开发的策略
  19. Websocket 可以玩出些什么花儿?
  20. 酷狗与鸿蒙系统,酷狗音乐鸿蒙版app

热门文章

  1. 工业4.0的小小思考
  2. 文件上传与下载问题记录
  3. 前端含金量较高的网站推荐
  4. uwp选取文件夹并读取其中的图片
  5. [记录]java.math.biginteger cannot be cast to java.lang.long
  6. [转]Oracle Client 11g安裝經驗
  7. Android开发探秘之三:利用jsoup解析HTML页面
  8. Android多线程源码学习笔记一:handler、looper、message、messageQueue
  9. day08 MapReduce
  10. easyUI的combobox设置隐藏和显示