关于StringBuilder的System.arraycope()应用

如果你看过StringBuilder的源码,有一个System.arraycope()这个静态方法进行数组复制。该函数原型是: public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) src:源数组;srcPos:源数组要复制的起始位置;dest:目标数组;destPos:目的数组放置的起始位置;length:复制的长度。注意:src and dest都必须是同类型或者可以进行转换类型的数组. 而且你会发现这个函数可以实现自己到自己复制,比如: int[] arr ={0,1,2,3,4,5,6,7}; System.arraycopy(arr, 0, arr, 3 ,3); 则结果为:{0,1,2,0,1,2,6,7}; 实现过程是这样的,先生成一个长度为length的临时数组,将fun数组中srcPos 到srcPos+length-1之间的数据拷贝到临时数组中,再执行System.arraycopy(临时数组,0, arr, 3, 3)。

从这里,我们发现System.arraycopy()在复值的时候会有开辟临时空间和复制数组元素的消耗。而StringBuilder()的初始空间为16,有时候盲目使用它。也未必最快,根据具体优化! 

在你初始化一个StringBuilder 之后,它会自动申请一个默认的StringBuilder 容量(默认值是16),这个容量是由Capacity来控制的.并且允许,我们根据需要来控制Capacity的大小,也可以通过Length来获取或设置StringBuilder 的长度。默认的Capacity初始化为16,接着我们添加18个字符,capacity为32,可以推导capacity的公式。

1 if ( Capacity < Length && Capacity > 0 ){ 2 Capacity *= 2; 3 } 

可以看到,StringBuilder是以当前的Capacity*2来扩充的。所以,在使用StringBuilder需要特别注意,尤其是要拼接或追加N多字符的时候,要注意技巧的使用,可以适当的,有预见性的设置Capacity的值,避免造成过大内存的浪费,节约无谓的内存空间,并造成不必要的内存消耗。

posted on 2015-12-08 10:19  润航  阅读(278)  评论(0)    收藏  举报

导航