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

  • 时间:
  • 浏览:1

可能StringBuffer中的append(String str)函数含有另2个多多的说说,

输出:

奇怪,benfore changed为什么长度都有12却说14呢?哈哈,刚开始英语 英语 我也困惑了一下,仔细想想就会明白的,让人输出sb3看看System.out.println("the content of sb3 is " + sb3.toString());

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());

两者输出结果会一样么?

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

如此实际结果怎样呢?

输出:

注:还要用到的函数说明:

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.

输出:

例2:

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

在声明2个多多StringBuffer变量的却说,用字符串进行初始化,容量会有变化么?

导致 :

StringBuffer的默认构造函数为

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( 1000 ), the capacity is  1000

 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(1000
 
);

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

问题图片: 

为有哪些要(旧值+1)*2呢?

我很多很多人的想法:

你说有哪些是考虑到value.length的值可能为0(初始化时设置StringBuffer的capactity为0).

可能考虑到溢出的清况 ?

为什么么让可能是JVM的很多很多限制,我的机器数组最大还还要设置为100093110006,再大就报错:

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


100093110006你这个 数字好奇怪

还有哪方面的考虑么?谁知道,能别问我么?

四.StringBuffer的capacity还里能不还里能 大还里能 小 例5:

结论:

当设置StringBuffer的容量

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

前几天写了一篇文章“ 怎样让人的多多系统进程 运行的放慢(1)---String VS StringBuffer ”,文章在情景三中提到了怎样通过“设置StringBuffer的容量来提升性能”,其含有个问题图片我如此想明白,却说为有哪些StringBuffer的容量自动增加的却说是“2*旧值+2”呢

输出:

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

public   StringBuffer() {

      
 this ( 16 
 );

问题图片: 

为什么第一种妙招的StringBuffer的capacity是27(16+11)呢? 

导致 :  StringBuffer的带参数的构造函数

一.StringBuffer的默认capacity

例1:

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 
;

导致 :

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

结论: 

StringBuffer的capacity等于用来初始化的字符串长度(11)加在StringBuffer的默认容量(16),而都有亲戚朋友想当然的在默认容量16中搞懂12个多多来存放字符串“hello world”。

可能亲戚朋友不设置StringBuffer的capacity,分别对两者继续追加字符串,任其自动增长,其容量增长如下:

第一种清况 :27,56,114,21000,462,926...,

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

(为有哪些容量增加会是你这个 规律,底下会做解释)。

我你还里能要清况 2节省空间的概率大很多很多,可能StringBuffer的capacity的增长比清况 1慢,每次增加的空间小很多很多。

很多很多很多很多却说写代码的却说还还要考虑使用第二种妙招(使用StringBuffer的append()),怪怪的是初始化字符串很长的清况 。当然这会多写一行代码^+^: 

三.StringBuffer的capacity变化

例3:

结论: 

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

亲戚朋友执行说说会出错么?

我的报错,我的是jdk1.4

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

1 public  StringBuffer(String str) {

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

3        
append(str);

4 }

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  

 本文转自BlogJavaOo缘来都有你oO的博客,原文链接:怎样让人的多多系统进程 运行的放慢(1)之续---揭秘StringBuffer的capacity,如需转载请自行联系原博主。

着实问题图片依然如此正确处理,不过也发现了不少有趣的问题图片,在此和亲戚朋友分享 。希望能让人有所收获,欢迎亲戚朋友一并讨论。 

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;

}

with no characters, the initial capacity of StringBuffer is  16 

and the length of the StringBuffer is  
0

注:

问一下

String str = String.valueOf(null);

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