buffer.capacity()方法到底是怎样计算的?

jin19880101 2009-11-07 09:29:42
StringBuffer buffer = new StringBuffer();
buffer.append('S');
buffer.append("tringBuffer");

System.out.println(buffer.charAt(1));
System.out.println(buffer.capacity());
System.out.println(buffer.indexOf("tring"));
System.out.println("buffer = " + buffer.toString());

//这段代码为什么是16 ? 不是创建buffer空对象就已经是16,然后应该是16+"StringBuffer"=28呀



StringBuffer buffer = new StringBuffer("wish");
System.out.println(buffer.toString());
System.out.println(buffer.length());
System.out.println(buffer.capacity());
buffer.setCharAt(0,'W');
buffer.append('!');
buffer.append(" Here we are!");
buffer.insert(0, "Hello ");
System.out.println(buffer.toString());//Hello Wish! Here we are!
System.out.println(buffer.length());//24
System.out.println(buffer.capacity());//24+16=40


//而这段应该是40啊 不懂 请高手指教
...全文
349 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenfeibiao328 2009-11-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 swandragon 的回复:]
你的理解错误
//这段代码为什么是16 ? 不是创建buffer空对象就已经是16,然后应该是16+"StringBuffer"=28呀
new  StringBuffer();初始一个容量为16的StringBuffer对象
append("tringBuffer");后,容量还是16,因为StringBuffer长度是12,没有超出16
当字符串的长度大于16时,StringBuffer扩充为(原容量 + 1) * 2

new StringBuffer("wish");
容量为"wish"的长度 4+16 = 20;
扩充容量 (20+1)* 2 = 42

看看StringBuffer的源码,是通过一个char数组实现的

[/Quote]
正解
wifewifewife 2009-11-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 swandragon 的回复:]
你的理解错误
//这段代码为什么是16 ? 不是创建buffer空对象就已经是16,然后应该是16+"StringBuffer"=28呀
new  StringBuffer();初始一个容量为16的StringBuffer对象
append("tringBuffer");后,容量还是16,因为StringBuffer长度是12,没有超出16
当字符串的长度大于16时,StringBuffer扩充为(原容量 + 1) * 2

new StringBuffer("wish");
容量为"wish"的长度 4+16 = 20;
扩充容量 (20+1)* 2 = 42

看看StringBuffer的源码,是通过一个char数组实现的

[/Quote]
非常正确。
其实ArrayList,LinkedList都差不多,只是增量不一样而以。,楼主认真去理解吧。
loveofmylife 2009-11-07
  • 打赏
  • 举报
回复
LS正解,看了一下源码,顺便给你贴一下

StringBuffer extends AbstractStringBuilder
public StringBuffer() {
super(16);
}//默认初始16
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}//另一种构造方式

再看一下他的父类的源码
abstract class AbstractStringBuilder implements Appendable, CharSequence

char value[];//内部维护一个char数组
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}

void expandCapacity(int minimumCapacity) {
int newCapacity = (value.length + 1) * 2;
if (newCapacity < 0) {
newCapacity = Integer.MAX_VALUE;
} else if (minimumCapacity > newCapacity) {
newCapacity = minimumCapacity;
}
value = Arrays.copyOf(value, newCapacity);
}//扩充容量



swandragon 2009-11-07
  • 打赏
  • 举报
回复
你的理解错误
//这段代码为什么是16 ? 不是创建buffer空对象就已经是16,然后应该是16+"StringBuffer"=28呀
new StringBuffer();初始一个容量为16的StringBuffer对象
append("tringBuffer");后,容量还是16,因为StringBuffer长度是12,没有超出16
当字符串的长度大于16时,StringBuffer扩充为(原容量 + 1) * 2

new StringBuffer("wish");
容量为"wish"的长度 4+16 = 20;
扩充容量 (20+1)* 2 = 42

看看StringBuffer的源码,是通过一个char数组实现的

62,634

社区成员

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

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