StringBuffer的capacity()方法

zhhw52000 2009-07-10 11:47:54
StringBuffer str = new StringBuffer();
str.append("大家好我们大家都很愿意学习java语言");
System.out.println("length:"+str.length()); //返回19,因为初始化的16个字符空间已经不够,这时会自动扩容
System.out.println("Capacity:"+str.capacity()); //返回34

那么这个str.capacity()为34是如何得出的呢??查了api也只是草草地说这个方法是“返回当前容量”的意思。

希望各位高手能对这个方法进行详细,只要说出这34是如何得出的就行了,谢谢
...全文
691 18 打赏 收藏 举报
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
alien01 2010-11-05
  • 打赏
  • 举报
回复
受教了,6楼
zhjpo521 2010-10-04
  • 打赏
  • 举报
回复
自己做下实验,当StringBuffer实例长度大于16,容量会自动变为(旧值+1)*2
zhhw52000 2009-07-12
  • 打赏
  • 举报
回复
终于得到解决了。谢谢4楼与14楼朋友。
云上飞翔 2009-07-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhhw52000 的回复:]
还是没解决

我将字符串改成“我们大家都很愿意学习java语言zzzzzzzzzzzzzzzzzzzz”那么这个时候方法capacity()返回的却是39

就变成了什么呢?超出16为34,超出34后就变成多几个字符加几个字符


如果说是new StringBuffer(String s)这个构造方法呢,又该如何计算呢?
[/Quote]
答:楼主的一定要弄清楚问题的精神令人佩服。这是学任何东西都要有的态度。
1)new StringBuffer(String s)这个构造方法呢,又该如何计算呢?
答:s.length() + 16,然后再append(s);

2)new StringBuffer();
答:16。
那么:append(s);是如何扩容的呢?其实4楼的代码已经说得很清楚了
思想是:最小容量是:当前的长度+串长,拟扩充的新容量是:(旧容量+1)*2
若:最小容量>拟扩充的新容量,则按最小容量扩充,否则(拟扩充的新容量>=最小容量):就按拟扩充的新容量扩充。

楼主的第一次串:
StringBuffer str = new StringBuffer(); //容量是16
str.append("大家好我们大家都很愿意学习java语言"); //扩容。如何扩?
最小容量是:0(当前长度是0)+19(那个要append的串长)=19
拟扩充的新容量:(16+1)*2=34
因为:最小容量<拟扩充的新容量,则此时按:拟扩充的新容量即34进行扩容。


楼主的第二次串:
StringBuffer str = new StringBuffer(); //容量是16
str.append("我们大家都很愿意学习java语言zzzzzzzzzzzzzzzzzzzz"); //扩容。如何扩?

最小容量是:0(当前长度是0)+36(那个要append的串长)=36
拟扩充的新容量:(16+1)*2=34
因为:最小容量>拟扩充的新容量,则此时按:最小容量即36进行扩容。


tobeno2 2009-07-11
  • 打赏
  • 举报
回复
不错,学习了
凌霞君 2009-07-10
  • 打赏
  • 举报
回复
貌似不是很清楚!
bigbug9002 2009-07-10
  • 打赏
  • 举报
回复
没有看清题,这个34真不知道是怎么得来的。只知道会扩容,为什么会由16扩到34?这个真不清楚。
bigbug9002 2009-07-10
  • 打赏
  • 举报
回复
capacity()返回StringBuffer的容量, length()返回StringBuffer里放着的字符串的长度。
top00zw 2009-07-10
  • 打赏
  • 举报
回复
他以什么方式增长的,就得看源代码了
zhhw52000 2009-07-10
  • 打赏
  • 举报
回复
还是没解决

我将字符串改成“我们大家都很愿意学习java语言zzzzzzzzzzzzzzzzzzzz”那么这个时候方法capacity()返回的却是39

就变成了什么呢?超出16为34,超出34后就变成多几个字符加几个字符


如果说是new StringBuffer(String s)这个构造方法呢,又该如何计算呢?
javajoy 2009-07-10
  • 打赏
  • 举报
回复
不错,学习了
yxc0433 2009-07-10
  • 打赏
  • 举报
回复
学习了
lyz0622_1022 2009-07-10
  • 打赏
  • 举报
回复

/**
* The value is used for character storage.
*/
char value[];

/**
* The count is the number of characters used.
*/
int count;

public synchronized int length() {
return count;
}
public synchronized int capacity() {
return value.length;
}




源码如上面所示:
可知:
length返回的字符的个数
capacity返回的是储存字符所需的字节数
mqinghuang 2009-07-10
  • 打赏
  • 举报
回复
学习了,顶楼上的,解释得很好,我试过了,是这样的,
ZhaoHuiZiXin 2009-07-10
  • 打赏
  • 举报
回复
StringBuffer在内部维护一个字符数组,当你使用缺省的构造函数来创建StringBuffer对象的时候, StringBuffer的容量被初始化为16个字符,也就是说缺省容量就是16个字符。当StringBuffer达到最大容 量的时候,它会将自身容量增加到当前的2倍再加2,也就是(2*旧值+2)。

如果你使用缺省值,初始化之后接着往里面追加字符,在你追加到第17(原文是16,其实是错误的,因为在追加到第16个字符的时候,容量不会发生变化,很抱歉,以后会更严谨一些^+^)个字符的时候它会将容量增加 到34(2*16+2),当追加到34个字符的时候就会将容量增加到70(2*34+2)。无论何事只要StringBuffer 到达它的最大容量它就不得不创建一个新的字符数组然后重新将旧字符和新字符都拷贝一遍。所以给 StringBuffer设置一个合理的初始化容量值,会提升程序的性能。

lulu0126 2009-07-10
  • 打赏
  • 举报
回复
学习 4楼

受教了!
ThirstyCrow 2009-07-10
  • 打赏
  • 举报
回复
看看源代码就知道了。AbstractStringBuilder
不过这种问题就算知道了也没多大意义吧。

#  /**
# * This implements the expansion semantics of ensureCapacity with no
# * size check or synchronization.
# */
# void expandCapacity(int minimumCapacity) {
# int newCapacity = (value.length + 1) * 2;
# if (newCapacity < 0) {
# newCapacity = Integer.MAX_VALUE;
# } else if (minimumCapacity > newCapacity) {
# newCapacity = minimumCapacity;
# }
# char newValue[] = new char[newCapacity];
# System.arraycopy(value, 0, newValue, 0, count);
# value = newValue;
# }
发帖
Java SE

6.2w+

社区成员

Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
帖子事件
创建了帖子
2009-07-10 11:47
社区公告
暂无公告