从API查到capacity的作用是查看StringBuffer的容器容量是多少,刚开始纳闷这个跟length的区别在哪?试验了几次感觉有点不解。所以直接跟进源码分析。

直接通过new StringBuffer(String str);时,capacity是str.length+16,从源码可知:

如果直接是new StringBuffer(),则capacity为16,见下图:

如果小于16则默认容器的大小为16。如果大于16则会调用expandCapacity 函数进行容量的扩展。

由源码可以看到扩展的规则是把旧的容量(value的长度)*2+2,然后与现有的比较,如果小于则把现有的容量当做新的,如果大于则用新得到的容量。

所以第一次append时,小于16则不需扩展,如果大于16则会直接扩展到34(16*2+2),比较得到大于append后的长度的话则用34,如果不 是则用append后的长度。

此时capacity的大小等于append后的长度,如果在append的话,若不超过70(34*2+2)的话,此时则capacity为70,如果超过70则继续用第二次append后的总长度。

实验源码:

1 public static voidmain(String[] args) {2

3 //StringBuffer的初始容量为16个字节长度。

4

5 StringBuffer s = newStringBuffer();6

7 s.append("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww");8

9 //超过16不超过34则用34,超过34则用append后的长度

10

11 s.append("a");12

13 //若上面append刚好超过34,为35,则capacity为35,但是若append一个字节,则为35*2+2=72

14

15 sop(s);16

17 sop(s.capacity()); //字符串容器的容量

18

19 sop(s.length()); //字符串的实际长度

20

21 }

java capacity_关于Java中StringBuffer的capacity问题相关推荐

  1. java 字符串用法_java中字符串的用法

    1.String中的每个字符都是一个16位的Unicode字符,用Unicode很容易表达丰富的国际化字符集,比如很好的中文支持.甚至Java的标识符都可以用汉字,但是没人会用吧(只在一本清华的< ...

  2. [JAVA基础类库] String类 ○ StringBuffer类 ○ StringBuilder类

    引言 字符串就是一连串的字符序列,Java提供了String.StringBuffer和StringBuilder三个类来封装对字符串,并提供了系列方法来操作字符串对象. String类是不可变类的: ...

  3. java 字符串总结_Java中字符串(String)总结

    先说说JDK API: JDK中包含大量的API类库,所谓API(Application Programming Interface,应用程序编程接口,这些功能以类的形式封装). JDK API包含的 ...

  4. java安装_Java开发中更多常见的危险信号

    java安装 在< Java开发中的常见危险信号>一文中,我介绍了一些不一定本身就是错误或不正确的做法,但它们可能表明存在更大的问题. 这些"红色标记"类似于" ...

  5. Java String,StringBuilder和StringBuffer的区别 StringBuilder StringBuffer String

    可以证明,字符串操作是计算机程序设计中最常见的行为. String:不可变的对象,对String对象进行改变的时候其实都等同于生成了一个新的String对象,然后将引用指向新的String对象,原St ...

  6. StringWriter/PrintWriter在Java输出异常信息中的作用

    闲来无事,看看JUnit的源代码.刚刚开始看就发现一段有趣的代码: public String trace() {StringWriter stringWriter = new StringWrite ...

  7. Java删除properties配置文件中指定键值的代码

    将开发过程较好的一些内容片段记录起来,下面的内容段是关于Java删除properties配置文件中指定键值的内容. public static boolean deleteKeyValue4Pro(S ...

  8. [改善Java代码]减少HashMap中元素的数量

    在系统开发中我们经常会使用HashMap作为数据集容器,或者是用缓冲池来处理,一般很稳定,但偶尔也会出现内存溢出的问题(OutOfMemory错误),而且这经常是与HashMap有关的.而且这经常是与 ...

  9. java 多线程性能_Java中多线程的性能比较

    java 多线程性能 Java中有多种用于多线程的技术. 可以通过同步关键字,锁或原子变量来并行化Java中的一段代码. 这篇文章将比较使用synced关键字ReentrantLock,getAndI ...

最新文章

  1. 从原则、方案、策略及难点阐述分库分表
  2. java gettext返回值_012-关于EditText中的getText()方法的返回值类型以及string的转换问题(转)...
  3. Jmeter学习记录的知识点
  4. Python中pandas dataframe删除一行或一列:drop函数
  5. 读写EXCEL的例子
  6. android SQL 语句
  7. PostMessage
  8. OpenCV计算机视觉实战(Python版)资源
  9. miui 8.2 android版本下载,miui8系统
  10. 2.9 iframe
  11. “音”你而来,“视”而可见 腾讯云+社区音视频技术开发实战沙龙圆满结束...
  12. SQL那些事儿(十一)--ODBC,OLE-DB,ADO.NET区别
  13. 面试了一个 35+ 岁的大佬,一言难尽......
  14. 4.jvm初体验-内存溢出问题的分析与解决
  15. android 系统宏定义,Android.mk宏定义demo【转】
  16. java中this有什么作用_Java中this有什么用
  17. 树莓派: oled屏幕字体制作
  18. 玩客云刷机(2022-3-19亲测)
  19. 3分钟搞明白信用评分卡模型模型验证
  20. 最新Tomcat安装及配置教程+JavaWeb项目部署

热门文章

  1. 【TensorFlow】占位符:tf.placeholder,与feed_dict
  2. Linux设备驱动程序概念
  3. OpenCV形态学变换函数morphologyEx()开运算的使用
  4. 深度学习分割json_to_data报错Too many dimensions: 3 > 2
  5. JAVA-抽象类/类继承
  6. 【计算机网络】聊一聊那些常见的网络通信的性能指标
  7. android view知识点 总结
  8. 三个简单的问题,让你顺势而为
  9. Duilib及demo
  10. 【C语言】练习5-8