论坛首页 Java企业应用论坛

stringbuffer初始容量的好处

浏览 9273 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (5) :: 隐藏帖 (1)
作者 正文
   发表时间:2011-04-02  
经常看人写到
final int INIT_SIZE = 10;
StringBuffer buf = new StringBuffer(INIT_SIZE);

想知道这样有哪些好处?与这样比较
StringBuffer buf = new StringBuffer();
   发表时间:2011-04-02  
呵呵。
StringBuffer buf = new StringBuffer();
这句话表示初始化了一个空的初始容量为16个字符的空间大小。

StringBuffer buf = new StringBuffer(INIT_SIZE);
表示创建了INIT_SIZE大小的空的字符空间。

StringBuffer内部是通过创建字符数组保存数据的,假如当前的容量小于实际存储的容量,它会以2倍容量的大小,重新构造新的字符数组,然后将以前的内容拷贝到新的字符数组中。 假如我们知道了需要存储数据的大小,直接指定开辟的空间,那样可以减少内部数组创建的次数。
1 请登录后投票
   发表时间:2011-04-05  
technoboy 回答得不错!


import java.io.*;
import java.lang.*;
import java.util.Calendar;
import java.util.Date;

public class tTest {

final static int INIT_SIZE = 10;

@SuppressWarnings("deprecation")
public static void main(String args[]) {

StringBuffer buf = new StringBuffer();
// 这句话表示初始化了一个空的初始容量为16个字符的空间大小。

StringBuffer buf1 = new StringBuffer(INIT_SIZE);



System.out.println(buf.capacity());
System.out.println(buf1.capacity());



buf.append("sadlfkjdfkasadfasdfaaa0ouipuiou");
buf1.append("sadlfkjdfkasadfasdfaaa0ouipuiou");


System.out.println(buf.capacity());
System.out.println(buf1.capacity());
}
}
0 请登录后投票
   发表时间:2011-04-05  
Technoboy 写道
呵呵。
StringBuffer buf = new StringBuffer();
这句话表示初始化了一个空的初始容量为16个字符的空间大小。

StringBuffer buf = new StringBuffer(INIT_SIZE);
表示创建了INIT_SIZE大小的空的字符空间。

StringBuffer内部是通过创建字符数组保存数据的,假如当前的容量小于实际存储的容量,它会以2倍容量的大小,重新构造新的字符数组,然后将以前的内容拷贝到新的字符数组中。 假如我们知道了需要存储数据的大小,直接指定开辟的空间,那样可以减少内部数组创建的次数。

赞成,也是一种节省内存,提高效率的方式吧
0 请登录后投票
   发表时间:2011-04-05   最后修改:2011-04-05
Technoboy 写道
呵呵。
StringBuffer buf = new StringBuffer();
这句话表示初始化了一个空的初始容量为16个字符的空间大小。

StringBuffer buf = new StringBuffer(INIT_SIZE);
表示创建了INIT_SIZE大小的空的字符空间。

StringBuffer内部是通过创建字符数组保存数据的,假如当前的容量小于实际存储的容量,它会以2倍容量的大小,重新构造新的字符数组,然后将以前的内容拷贝到新的字符数组中。 假如我们知道了需要存储数据的大小,直接指定开辟的空间,那样可以减少内部数组创建的次数。

同意Technoboy观点,细节补充一下。
AbstractStringBuilder里的expandCapacity(int minimumCapacity)完成数组扩容,源码如下:
    void expandCapacity(int minimumCapacity) {
	int newCapacity = (value.length + 1) * 2; //先以(当前容量+1)*2扩容
        if (newCapacity < 0) {
            newCapacity = Integer.MAX_VALUE;
        } else if (minimumCapacity > newCapacity) {  //如果增长超过上面扩容的容量,以增长的容量进行扩容
	    newCapacity = minimumCapacity;
	}
        value = Arrays.copyOf(value, newCapacity);
    }
0 请登录后投票
   发表时间:2011-04-05  
不错,学习了!!
0 请登录后投票
   发表时间:2011-04-05  
又长见识了
0 请登录后投票
   发表时间:2011-04-06  
同上哈,以前面试的时候有人就问过~~~~~~可惜没答上哈
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics