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是如何得出的就行了,谢谢
...全文
839 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
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字符串操作大全,适合初学者,浅显易懂 部JAVA字符串操作 2008-07-11 15:39:42| 分类: JAVA | 标签: |字号大中小 订阅 . JAVA字符串的方法 String a = "53c015"; //Integer.parseInt(s, radix) radix设置为10,表示10进制,16表示16进制啦 int i = Integer.parseInt(a, 16); 1、length() 字符串的长度   例:char chars[]={'a','b'.'c'};     String s=new String(chars);     int len=s.length(); 2、charAt() 截取一个字符   例:char ch;     ch="abc".charAt(1); 返回'b' 3、getChars() 截取多个字符   void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)   sourceStart指定了子串开始字符的下标,sourceEnd指定了子串结束后的下一个字符的下标。因此,子串包含从sourceStart到sourceEnd-1的字符。接收字符的数组由target指定,target中开始复制子串的下标值是targetStart。   例:String s="this is a demo of the getChars method.";     char buf[]=new char[20];     s.getChars(10,14,buf,0); 4、getBytes()   替代getChars()的一种方法是将字符存储在字节数组中,该方法即getBytes()。 5、toCharArray() 6、equals()和equalsIgnoreCase() 比较两个字符串 7、regionMatches() 用于比较一个字符串中特定区域与另一特定区域,它有一个重载的形式允许在比较中忽略大小写。   boolean regionMatches(int startIndex,String str2,int str2StartIndex,int numChars)   boolean regionMatches(boolean ignoreCase,int startIndex,String str2,int str2StartIndex,int numChars) 8、startsWith()和endsWith()   startsWith()方法决定是否以特定字符串开始,endWith()方法决定是否以特定字符串结束 9、equals()和==   equals()方法比较字符串对象中的字符,==运算符比较两个对象是否引用同一实例。   例:String s1="Hello";     String s2=new String(s1);     s1.eauals(s2); //true     s1==s2;//false 10、compareTo()和compareToIgnoreCase() 比较字符串 11、indexOf()和lastIndexOf()   indexOf() 查找字符或者子串第一次出现的地方。   lastIndexOf() 查找字符或者子串是后一次出现的地方。 12、substring()   它有两种形式,第一种是:String substring(int startIndex)          第二种是:String substring(int startIndex,int endIndex) 13、concat() 连接两个字符串 14 、replace() 替换   它有两种形式,第一种形式用一个字符在调用字符串中所有出现某个字符的地方进行替换,形式如下:   String replace(char original,char replacement)   例如:String s="Hello".replace('l','w');   第二种形式是用一个字符序列替换另一个字符序列,形式如下:   String replace(CharSequence original,CharSequence replacement) 15、trim() 去掉起始和结尾的空格 16、valueOf() 转换为字符串 17、toLowerCase() 转换为小写 18、toUpperCase() 转换为大写 19、StringBuffe

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧