如何让你的程序运行的更快(1)之续

  • 时间:
  • 浏览:0

结论: 

capacity增长的规律为 (旧值+1)*2

with characters, the capacity of StringBuffer is 27

but the length of the StringBuffer is 11

with append(), the capacity of StringBuffer is 16

but the length of the StringBuffer is 11

一.StringBuffer的默认capacity

例1:

我门歌词 执行得话会出错么?

我的报错,我的是jdk1.4

前几天写了一篇文章“ 如保我就的任务管理器池池运行的调快(1)---String VS StringBuffer ”,文章在情景三中提到了如保通过“设置StringBuffer的容量来提升性能”,其含有个什么的什么的问题 我没法想明白,却说 为哪几种StringBuffer的容量自动增加的完后 是“2*旧值+2”呢

1 public  StringBuffer(String str) {

2       this(str.length() + 16
 
);

3        
append(str);

4 }

两者输出结果会一样么?

你一定认为,这就有显然的么。用长度为11的字符串“hello world”进行初始化,其长度11小于StringBuffer的默认容量16。很多两者结果都为capacity=16,length=11。

没法实际结果如保呢?

例2:

二.用字符串初始化StringBuffer的内容

在声明一另另俩个多StringBuffer变量的完后 ,用字符串进行初始化,容量会有变化么?

我觉得 什么的什么的问题 依然没法解决,不过也发现了不少有趣的什么的什么的问题 ,在此和我门歌词 分享 。希望能我就有所收获,欢迎我门歌词 一同讨论。 

 1 StringBuffer sb4 = new  StringBuffer();

 2 System.out.println("before ensureCapacity(), the capacity is " +
 
 sb4.capacity());

 3 sb4.ensureCapacity(10
 
);

 4 System.out.println("after ensureCapacity(10), the capacity is " +
 
 sb4.capacity());

 5  
        

 6 System.out.print("now, the capacity is " + sb4.capacity() + ""
 
);

 7 sb4.ensureCapacity(20
 
);

 8 System.out.println("after ensureCapacity(20), the capacity is " +
 
 sb4.capacity());

 9  
        

10 System.out.print("now, the capacity is " + sb4.capacity() + ""
 
);

11 sb4.ensureCapacity(200
 
);

12 System.out.println("after ensureCapacity(200), the capacity is " + sb4.capacity());

什么的什么的问题 : 

如保第有并是否是土办法的StringBuffer的capacity是27(16+11)呢? 

原应着:  StringBuffer的带参数的构造函数

输出:

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

private   boolean  shared;         // A flag indicating whether the buffer is shared 



public  StringBuffer( int  length) {

      value 
 =   new   char 
[length];

      shared 
 =   false 
;

}

 

// 调用capacity()返回字符串数组value的长度,即StringBuffer的容量(capacity) 


public   synchronized   int  capacity() {

      return 
 value.length;

}

结论: 

StringBuffer的capacity等于用来初始化的字符串长度(11)加进StringBuffer的默认容量(16),而就有我门歌词 想当然的在默认容量16中背熟1一另另俩个多来存放字符串“hello world”。

将会我门歌词 不设置StringBuffer的capacity,分别对两者继续追加字符串,任其自动增长,其容量增长如下:

第有并是否是情况表:27,56,114,2200,462,926...,

第二种情况表:16,34,70  ,142,286,574...,

(为哪几种容量增加会是某些规律,上端会做解释)。

我都可不上能情况表2节省空间的概率大某些,将会StringBuffer的capacity的增长比情况表1慢,每次增加的空间小某些。

很多完后 写代码的完后 都可不上能考虑使用第二种土办法(使用StringBuffer的append()),有点硬是初始化字符串很长的情况表。当然这会多写一行代码^+^: 

三.StringBuffer的capacity变化

public   StringBuffer() {

      
 this ( 16 
 );

此时默认构造函数又调用了StringBuffer的代参数的构造函数,设置字符串数组value长度为16,如下:

注:可不上能用到的函数说明:

capacity():Returns the current capacity of the String buffer. 

                     The capacity is the amount of storage available for newly inserted characters;  

                      beyond which an allocation will occur.

length():   Returns the length (character count) of this string buffer.

before changed, the capacity is  16 

and the length is  
14 

first time increased, the capacity is  
34 

and the length is  
24 

second time increased, the capacity is  
70 

and the length is  
36  

输出:

结论:

当设置StringBuffer的容量

注:

问一下

String str = String.valueOf(null);

System.out.println(str.length());

奇怪,benfore changed如保长度就有12却说 14呢?哈哈,现在开使我也困惑了一下,仔细想想就会明白的,我就输出sb3看看System.out.println("the content of sb3 is " + sb3.toString());

before ensureCapacity(), the capacity is  16 

after ensureCapacity( 
10 ), the capacity is  16 

now, the capacity is  
16 , after ensureCapacity( 20 ), the capacity is  34 

now, the capacity is  
34 , after ensureCapacity( 200 ), the capacity is  200

原应着:

StringBuffer的默认构造函数为

原应着:

StringBuffer的容量增加函数expandCapacity():

例3:

 本文转自BlogJavaOo缘来有你在oO的博客,原文链接:如保我就的任务管理器池池运行的调快(1)之续---揭秘StringBuffer的capacity,如需转载请自行联系原博主。

输出:

什么的什么的问题 : 

为哪几种要(旧值+1)*2呢?

本人的想法:

我说是考虑到value.length的值将会为0(初始化时设置StringBuffer的capactity为0).

将会考虑到溢出的情况表?

有就让 将会是JVM的某些限制,我的机器数组最大都可不上能设置为2009312006,再大就报错:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space


2009312006某些数字好奇怪

还有哪方面的考虑么?谁知道,能我没法乎 么?

四.StringBuffer的capacity不到大不到小 例5:

StringBuffer sb  =   new  StringBuffer();

System.out.println( " with no characters, the initial capacity of StringBuffer is  "   + 
 sb.capacity());

System.out.println( " and the length of the StringBuffer is  "   +  sb.length());

with no characters, the initial capacity of StringBuffer is  16 

and the length of the StringBuffer is  
0

输出:

结论: StringBuffer的默认容量(capacity)为16

将会StringBuffer中的append(String str)函数含有完后 的得话,

private   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;

shared 
 =   false 
;