StringBuffer的capacity如何让你的程序运行的更快(1)之续---揭秘StringBuffer的capacity
来源:互联网 发布:讨论网络协议的优缺点 编辑:程序博客网 时间:2024/05/22 12:56
如何让你的程序运行的更快(1)之续---揭秘StringBuffer的capacity
前几天写了一篇文章“ 如何让你的程序运行的更快(1)---String VS StringBuffer ”,文章在情景三中提到了如何通过“设置StringBuffer的容量来提升性能”,其中有个问题我没有想明白,就是为什么StringBuffer的容量自动增加的时候是“2*旧值+2”呢?
虽然问题依然没有解决,不过也发现了不少有趣的问题,在此和大家分享 。希望能让你有所收获,欢迎大家一起讨论。
注:需要用到的函数说明:
capacity():Returns the current capacity of the String buffer.
length():
一.StringBuffer的默认capacity
例1:
输出:
and
结论: StringBuffer的默认容量(capacity)为16
原因:
StringBuffer的默认构造函数为
}
此时默认构造函数又调用了StringBuffer的代参数的构造函数,设置字符串数组value长度为16,如下:
private
public
}
public
}
二.用字符串初始化StringBuffer的内容
在声明一个StringBuffer变量的时候,用字符串进行初始化,容量会有变化么?
例2:
StringBuffer
System.out.println(
System.out.println(
StringBuffer
sb11.append(
System.out.println( " with
System.out.println(
两者输出结果会一样么?
你一定认为,这不是显然的么。用长度为11的字符串“hello world”进行初始化,其长度11小于StringBuffer的默认容量16。所以两者结果都为capacity=16,length=11。
那么实际结果如何呢?
输出:
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是27(16+11)呢?
原因:
StringBuffer的带参数的构造函数
3
4
结论:
StringBuffer的capacity等于用来初始化的字符串长度(11)加上StringBuffer的默认容量(16),而不是我们想当然的在默认容量16中拿出11个来存放字符串“hello world”。
如果我们不设置StringBuffer的capacity,分别对两者继续追加字符串,任其自动增长,其容量增长如下:
第一种情况:27,56,114,230,462,926...,
第二种情况:16,34,70
(为什么容量增加会是这种规律,后面会做解释)。
我想情况2节省空间的概率大一些,因为StringBuffer的capacity的增长比情况1慢,每次增加的空间小一些。
所以以后写代码的时候可以考虑使用第二种方法(使用StringBuffer的append()),特别是初始化字符串很长的情况。当然这会多写一行代码^+^:
三.StringBuffer的capacity变化
例3:
}
System.out.println(
System.out.println(
}
System.out.println(
System.out.println(
}
System.out.println(
System.out.println(
输出:
and
first
and
second
and
奇怪,benfore changed怎么长度不是12而是14呢?哈哈,开始我也困惑了一下,仔细想想就会明白的,你可以输出sb3看看System.out.println("the content of sb3 is " + sb3.toString());
结论:
capacity增长的规律为 (旧值+1)*2
原因:
StringBuffer的容量增加函数expandCapacity():
if
}
}
System.arraycopy(value,
value
shared
}
疑问:
为什么要(旧值+1)*2呢?
我自己的想法:
也许是考虑到value.length的值可能为0(初始化时设置StringBuffer的capactity为0).
或者考虑到溢出的情况?
但是可能是JVM的某些限制,我的机器数组最大可以设置为30931306,再大就报错:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
30931306这个数字好奇怪
还有哪方面的考虑么?谁知道,能告诉我么?
四.StringBuffer的capacity只能大不能小
例5:
11
12
输出:
after
now,
now,
结论:
当设置StringBuffer的容量
1、小于当前容量时,容量不变。
2、大于当前容量,并且小于(当前容量+1)*2,则容量变为(当前容量+1)*2。
3、大于当前容量,并且大于(当前容量+1)*2,则容量变为用户所设置的容量。
函数:ensureCapacity( )和 expandCapacity( )进行了控制
}
System.arraycopy(value,
value
shared
}
问一下
String str = String.valueOf(null);
System.out.println(str.length());
你们执行的话会出错么?
我的报错,我的是jdk1.4
因为StringBuffer中的append(String str)函数中有这样的语句,
if
}
int
expandCapacity(newcount);
str.getChars(
count
}
- StringBuffer的capacity如何让你的程序运行的更快(1)之续---揭秘StringBuffer的capacity
- 如何让你的程序运行的更快(1)之续---揭秘StringBuffer的capacity
- JAVA---揭秘StringBuffer的capacity
- StringBuffer的Capacity详解
- StringBuffer的capacity
- StringBuffer的capacity()方法
- stringbuffer capacity()的疑问
- 关于Java中StringBuffer的capacity问题
- StringBuffer中length()和capacity()的区别用法
- 在构造StringBuffer对象时,指定合适的capacity
- StringBuffer中length()和capacity()的区别用法
- StringBuffer setLength 和 append对capacity的影响
- StringBuffer中的length和capacity方法的区别
- Java-002-StringBuffer中的capacity的扩增机制
- java StringBuffer的length()和capacity()方法比较
- 关于StringBuffer对象的capacity方法返回值
- 如何让你的程序运行的更快(1)---StringVSStringBuffer
- 如何让你的程序运行的更快(1)---StringVSStringBuffer
- 蓝桥杯——报时助手 ,龟兔赛跑预测 ,芯片测试
- 白手起家学习数据科学 ——Machine Learning之“权衡Bias-Variance篇”(八)
- c++调用c文件的函数
- erlang四大behaviour之一gen_server(转载)
- Udev实现U盘或SD卡的自动挂载
- StringBuffer的capacity如何让你的程序运行的更快(1)之续---揭秘StringBuffer的capacity
- linux守护进程程序设计
- PAT乙级 锤子剪刀布 (20)
- C# WinForm程序退出的方法
- erlang四大behaviour之三-gen_event(转载)
- Real World Haskell 中文版
- 爬爬爬之路:UI(十八) 集合视图(UICollectionView)
- 阿里云WDCP安装memcached
- Android proguard with ormlite