文档章节

Effective Java 第三版——63. 注意字符串连接的性能

o
 osc_a22drz29
发布于 2019/03/24 10:47
字数 627
阅读 8
收藏 0

精选30+云产品,助力企业轻松上云!>>>

Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所以JDK 最好下载 JDK 9以上的版本。

Effective Java, Third Edition

#63. 注意字符串连接的性能

字符串连接操作符(+)是将几个字符串组合成一个字符串的便捷的方法。对于生成单行输出或构造一个小的、固定大小的对象的字符串表示形式,它是可以的,但是它不能伸缩。重复使用字符串连接运算符来连接n个字符串需要n的平方级的时间。这是由于字符串是不可变的这一事实导致的结果(条目 17)。当连接两个字符串时,需要复制这两个字符串的内容。

例如,考虑这个方法,它通过为每个项目重复连接一行来构造账单语句的字符串表示:

// Inappropriate use of string concatenation - Performs poorly!
public String statement() {
    String result = "";
    for (int i = 0; i < numItems(); i++)
        result += lineForItem(i);  // String concatenation
    return result;
}

如果项的数量很大,则该方法的性能非常糟糕。为了达到可接受的性能,使用StringBuilder代替String来存储正在构建的语句:

public String statement() {
    StringBuilder b = new StringBuilder(numItems() * LINE_WIDTH);
    for (int i = 0; i < numItems(); i++)
        b.append(lineForItem(i));
    return b.toString();
}

自Java 6以来,为了使字符串连接更快,已经做了大量工作,但是这两个方法在性能上的差异仍然很大:如果numItems返回100个元素,每个lineForItem返回一个固定长度为80个字符串,那么在我的机器上运行,第二个方法的速度是第一个方法的6.5倍。由于第一种方法在项目数量上是平方级增长的,而第二种方法是线性的,所以随着项目数量的增加,性能差异会变得越来越大。注意,第二个方法预先分配了一个足够大的StringBuilder来保存整个结果,从而消除了自动增长的需要。即使使用默认大小的StringBuilder,它仍然比第一个方法快5.5倍。

道理很简单:除非性能无关紧要,否则不要使用字符串连接操作符组合多个字符串。而是使用StringBuilder的append方法。或者,使用字符数组,或者一次处理一个字符串,而不是把它们组合起来。

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

渗透测试的概念和实战

目录 1. 前言 2. 常见web安全漏洞 3. 思路 3.1渗透测试思路 3.2黑客攻击思路 4. 暴力破解 4.1谷歌黑语法 4.1.1 黑语法inurl:搜索url包含指定字符串 4.1.2 黑语法intitle:搜索网页中的标题名...

六道木
20分钟前
19
0
Nginx搭建

Web服务器 放置网站文件,全世界浏览 可以放置数据文件,让全世界可以下载。 Nginx官方网站www.nginx.org #rz nginx-1.11.6.tar.gz #ls #rpm -q zlib-devel pcre-devel #yum –y install zli...

osc_fnto2dbd
32分钟前
12
0
如何在1分钟内CSDN收益1000万,走上人生巅峰?!

事情的起因源于前几日CSDN专栏作者群中有位同志自曝收益:426584.46元(不用数了42万+,未证实是否属实),瞬间刷屏。 那么作为一位普通的技术分享者,是否有机会利用开源项目短时间内赢取白...

osc_8db3mwb5
33分钟前
23
0
【java基础(五十)】为什么要使用泛型程序设计

从Java程序设计语言1.0版发布以来,变化最大的部分就是泛型。致使Java SE 5.0中增加泛型机制的主要原因是为了满足1999年制定的最早的Java规范需求之一(JSR 14)。专家组花费了5年左右的时间...

osc_qcm2mqmy
35分钟前
20
0
如何将Unix时间戳转换为DateTime,反之亦然? - How can I convert a Unix timestamp to DateTime and vice versa?

问题: There is this example code, but then it starts talking about millisecond / nanosecond problems. 有此示例代码,但随后开始谈论毫秒/纳秒问题。 The same question is on MSDN, ......

javail
35分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部