java capacity_关于Java中StringBuffer的capacity问题
从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问题相关推荐
- java 字符串用法_java中字符串的用法
1.String中的每个字符都是一个16位的Unicode字符,用Unicode很容易表达丰富的国际化字符集,比如很好的中文支持.甚至Java的标识符都可以用汉字,但是没人会用吧(只在一本清华的< ...
- [JAVA基础类库] String类 ○ StringBuffer类 ○ StringBuilder类
引言 字符串就是一连串的字符序列,Java提供了String.StringBuffer和StringBuilder三个类来封装对字符串,并提供了系列方法来操作字符串对象. String类是不可变类的: ...
- java 字符串总结_Java中字符串(String)总结
先说说JDK API: JDK中包含大量的API类库,所谓API(Application Programming Interface,应用程序编程接口,这些功能以类的形式封装). JDK API包含的 ...
- java安装_Java开发中更多常见的危险信号
java安装 在< Java开发中的常见危险信号>一文中,我介绍了一些不一定本身就是错误或不正确的做法,但它们可能表明存在更大的问题. 这些"红色标记"类似于" ...
- Java String,StringBuilder和StringBuffer的区别 StringBuilder StringBuffer String
可以证明,字符串操作是计算机程序设计中最常见的行为. String:不可变的对象,对String对象进行改变的时候其实都等同于生成了一个新的String对象,然后将引用指向新的String对象,原St ...
- StringWriter/PrintWriter在Java输出异常信息中的作用
闲来无事,看看JUnit的源代码.刚刚开始看就发现一段有趣的代码: public String trace() {StringWriter stringWriter = new StringWrite ...
- Java删除properties配置文件中指定键值的代码
将开发过程较好的一些内容片段记录起来,下面的内容段是关于Java删除properties配置文件中指定键值的内容. public static boolean deleteKeyValue4Pro(S ...
- [改善Java代码]减少HashMap中元素的数量
在系统开发中我们经常会使用HashMap作为数据集容器,或者是用缓冲池来处理,一般很稳定,但偶尔也会出现内存溢出的问题(OutOfMemory错误),而且这经常是与HashMap有关的.而且这经常是与 ...
- java 多线程性能_Java中多线程的性能比较
java 多线程性能 Java中有多种用于多线程的技术. 可以通过同步关键字,锁或原子变量来并行化Java中的一段代码. 这篇文章将比较使用synced关键字ReentrantLock,getAndI ...
最新文章
- 从原则、方案、策略及难点阐述分库分表
- java gettext返回值_012-关于EditText中的getText()方法的返回值类型以及string的转换问题(转)...
- Jmeter学习记录的知识点
- Python中pandas dataframe删除一行或一列:drop函数
- 读写EXCEL的例子
- android SQL 语句
- PostMessage
- OpenCV计算机视觉实战(Python版)资源
- miui 8.2 android版本下载,miui8系统
- 2.9 iframe
- “音”你而来,“视”而可见 腾讯云+社区音视频技术开发实战沙龙圆满结束...
- SQL那些事儿(十一)--ODBC,OLE-DB,ADO.NET区别
- 面试了一个 35+ 岁的大佬,一言难尽......
- 4.jvm初体验-内存溢出问题的分析与解决
- android 系统宏定义,Android.mk宏定义demo【转】
- java中this有什么作用_Java中this有什么用
- 树莓派: oled屏幕字体制作
- 玩客云刷机(2022-3-19亲测)
- 3分钟搞明白信用评分卡模型模型验证
- 最新Tomcat安装及配置教程+JavaWeb项目部署