字符串连接:使用StringBuffer#append来替代”+”真的会带来性能提升吗?
来源:互联网 发布:网络大电影市场前景 编辑:程序博客网 时间:2024/04/28 23:12
We know:
1.StringBuffer sb = new StringBuffer(); //默认的缓冲区大小是16
2.用 + 来连接字符串,编译的时候,会自动转换成StringBuffer
for example:【参考于大神之作:http://www.ticmy.com/?p=69】
String s =
"today is "
+
"a good day"
;
编译直接形成:
Code:
0
: ldc #
5
;
//String today is a good day
String tmp =
" on the desk"
;
String s2 =
"there are "
+ count +
" books "
+ tmp;
编译直接形成:
Code:
0
: iconst_2
1
: istore_0
2
: ldc #
8
;
//String on the desk
4
: astore_1
5
:
new
#
9
;
//class java/lang/StringBuilder
8
: dup
9
: invokespecial #
10
;
//Method java/lang/StringBuilder."<init>":()V
12
: ldc #
11
;
//String there are
14
: invokevirtual #
12
;
//Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
17
: iload_0
18
: invokevirtual #
13
;
//Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
21
: ldc #
14
;
//String books
23
: invokevirtual #
12
;
//Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
26
: aload_1
27
: invokevirtual #
12
;
//Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
30
: invokevirtual #
15
;
//Method java/lang/StringBuilder.toString:()Ljava/lang/String;
33
: astore_2
但是对于循环内部(每次创建会引起性能损耗不少):
String s3 =
""
;
for
(
int
i=
0
; i<
100
; i++) {
s3 = s3 + i;
}
Code:
0
: ldc #
16
;
//String
2
: astore_0
3
: iconst_0
4
: istore_1
5
: iload_1
6
: bipush
100
8
: if_icmpge
36
11
:
new
#
9
;
//class java/lang/StringBuilder
14
: dup
15
: invokespecial #
10
;
//Method java/lang/StringBuilder."<init>":()V
18
: aload_0
19
: invokevirtual #
12
;
//Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
22
: iload_1
23
: invokevirtual #
13
;
//Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
26
: invokevirtual #
15
;
//Method java/lang/StringBuilder.toString:()Ljava/lang/String;
字节码代表的代码含义如下:
String s3 =
""
;
for
(
int
i=
0
; i<
100
; i++) {
s3 =
new
StringBuilder().append(s3).append(i).toString();
}
We get:
1.有的时候默认的缓冲区大小不够用,需要扩大,这就会影响到性能。如果我们在初始化的时候,设置一个合适的大小,new StringBuffer(xxx);这样就能在一定程度上提高性能。
2.在循环中使用 + 时,编译器的优化并不如我们期望的那么好,所以就要自己来吧new StringBuffer(xxx)拿出来,写外边了
String s3 =
""
;
StringBuilder tmp =
new
StringBuilder();
tmp.append(s3);
for
(
int
i=
0
; i<
100
; i++) {
tmp.append(i);
}
s3 = tmp.toString();
1 0
- 字符串连接:使用StringBuffer#append来替代”+”真的会带来性能提升吗?
- 用StringBuilder(StringBuffer)#append替代字符串”+”会带来性能提升吗
- 用StringBuilder(StringBuffer)#append替代字符串”+”会带来性能提升吗(转)
- 用StringBuilder(StringBuffer)#append替代字符串”+”会带来性能提升吗
- 用StringBuilder(StringBuffer)#append替代字符串”+”会带来性能提升吗
- 用StringBuilder(StringBuffer)#append替代字符串”+”会带来性能提升吗
- 你真的会用StringBuffer吗?
- 什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好?
- 什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好?
- 利用stringbuilder来提升字符串的性能
- 【Java】StringBuffer的append()对字符串追加
- StringBuffer的"append" 和 String的"+"用来连接字符串哪个好些?
- java中字符串连接+=和concat函数以及stringbuffer的append的效率问题
- javascript字符串连接性能提升
- 使用 ContentProviderOperation 来提升性能
- 使用 ContentProviderOperation 来提升性能
- 使用 ContentProviderOperation 来提升性能
- 使用 ContentProviderOperation 来提升性能
- 用VLC搭建流媒体服务器
- jquery mobile实例
- Android NDK 如何缩减库的大小
- Android微信支付遇到的坑
- Android中ListView的addFooterView不显示的问题
- 字符串连接:使用StringBuffer#append来替代”+”真的会带来性能提升吗?
- Swift 正向传值以及利用闭包(closure)实现反向传值(七)
- CentOS7 安装 mongodb3.2.3 详细步骤
- 用vlc搭建简单的流媒体代理服务器
- iOS 离屏渲染的研究
- Java 回顾笔记_Sting类1
- Android项目EditText焦点问题
- 在Java中使用MongoDB
- 第三章 初始CC2640蓝牙协议栈