`
TonyLian
  • 浏览: 402135 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【第33条】了解字符串连接的性能

阅读更多

    这一条是一个良好的“习惯”,你可能一直没有注意到,但也没出什么问题,但是学会这一条会有不少性能的提高。

 

    两个字符串连接,一般是通过 + 操作符进行的。如

String s = "a" + "b";

String str = "Hello: ";
str = str + someone.getName().toString();

 

 

   但是,由于String是非可变类型(请参考【第13条】),所以这样做的代价其实挺大的。以 str1 = str1 + str2; 为例,执行时将原str1和str2进行拼接,然后在内存中开辟一块新(如果之前没有和拼接后的内容相同的字符串存在于内存中)的空间存放这个拼接后的新字符串,再将str1的引用转而指向这个新的地址,最后释放掉原来str1所指向的内存(如不再有其他String的内容和原来的str1相同)。

 

   如果这样的操作次数比较多,如

String str = "";
for (int i=1;i<10000;i++){
    str = str + i.toString() + " ";
}

 

  那么时间上的开销将非常大(空间上只能依赖虚拟机的垃圾回收机制勉强控制)。

 

   这时候,就需要StringBuffer这个类了(C#中的StringBuilder类似)。顾名思义,这是个字符串的缓冲区,它是一个可变类型,可以通过append方法在字符串的尾部追加内容。

StringBuffer sb = new StringBuffer();  // 如果事先可以知道总长度可以之前指定缓冲区的大小,否则采用默认大小,不够用时自动扩展,但这需要开销,所以如果能够事先知道大小,最好初始时就指定缓冲区大小

for(int i=0;i<10000;i++){
    sb.append(i.toString());
    sb.append(" ");
}

String str = sb.toString();

 

  一个应用场景就是你在自己的类中,改写的toString方法。里面可能要将各个有效域都输出成文本,记住:不要一个一个地“+”,而是要用StringBuffer的append方法,最后toString就可以了。

 

 

 

【Effective Java 学习笔记】系列连载专题请见:
http://tonylian.iteye.com/categories/64208

 

1
0
分享到:
评论

相关推荐

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    第三章 Sql查询与函数 一、 SQL概述 SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。同时也是数据库脚本文件的扩展名。  SQL...

    Java数组操作方法总结2.pdf

    使用Apache Commons Lang库中的`StringUtils.join()`方法,可以将数组元素连接成一个字符串,每个元素之间由指定的分隔符隔开: ```java String[] elements = {"a", "b", "c"}; String str = StringUtils.join...

    MYSQL,SQLSERVER,ORACLE常用的函数

    连接两个或多个字符串。例如: ```sql SELECT CONCAT('010-', '88888888') || '转23' AS 高乾竞电话 FROM dual; ``` 输出结果为完整的电话号码。 #### 4. INITCAP 将字符串首字母转换为大写。例如: ```sql SELECT ...

    JavaSE选择题第一套(含答案).doc

    选项D中直接使用字符串连接操作可以提高性能,但不是必须的,因为原代码已经使用了效率较高的`StringBuffer`。 6. `Date`类的默认`toString`方法会生成一个格式化的日期和时间字符串,包括年、月、日、小时、分钟、...

    高性能MySQL(第3版).part2

    1.5.4第三方存储引擎22 1.5.5选择合适的引擎24 1.5.6转换表的引擎27 1.6MySQL时间线(Timeline)29 1.7MySQL的开发模式32 1.8总结33 第2章MySQL基准测试35 2.1为什么需要基准测试35 2.2基准测试的策略37 ...

    PIC单片机C语言编程指南

    - **STRPBRK函数**:查找字符串中第一个出现在另一字符串中的字符。 - **STRRCHR函数**:查找字符串中最后一个匹配的字符。 - **STRSPN函数**:计算一个字符串中包含另一个字符串中的字符的数量。 - **STRSTR函数**...

    oracle 函数

    #### CONCAT函数:字符串连接 `CONCAT`函数用于连接两个或多个字符串。例如,`CONCAT('Hello', 'World')`将返回`'HelloWorld'`。在实际应用中,此函数常用于组合不同的数据字段,如姓名、地址等,形成完整的记录或...

    C++常用函数及对应头文件

    - `strncat(a, b, n)`:将字符串 `b` 的前 `n` 个字符连接到字符串 `a` 的末尾。 - `strcmp(a, b)`:比较字符串 `a` 和 `b`。返回值为 0 表示两字符串相等;如果 `a` 小于 `b`,则返回值小于 0;反之,则返回值...

    JAVA string函数总结.docx

    #### 二、字符串连接 字符串可以通过 `+` 运算符进行连接。例如: ```java String s1 = str1 + "" + str2; // 结果为 "helloworld" ``` #### 三、获取字符串信息 - **字符串长度**:使用 `length()` 方法可以...

    Java程序性能优化之二十三个建议

    3. **减少字符串连接**:使用StringBuilder或StringBuffer进行字符串拼接,而非 "+" 运算符,尤其是在循环中。 4. **合理使用final关键字**:对常量和方法参数使用final,可以提高代码执行效率,允许编译器进行优化...

    通过串口查看GPS

    在Java编程中,由于标准Java库不直接支持串口操作,因此需要依赖第三方库,如RXTXcomm库。RXTX是一个开源项目,提供了一组Java类,使得开发者能够与各种串行和并行端口进行通信,包括读取和写入数据。在描述中提到的...

    DB2数据库函数大全(附实例)

    16. **CONCAT**: 连接两个或多个字符串。 17. **LCASE or LOWER**: 将字符串转换为小写。 18. **UPPER or UCASE**: 将字符串转换为大写。 19. **LEFT**: 返回字符串左边的指定长度的子串。 20. **RIGHT**: 返回...

    PHP和MySQL WEB开发(第4版)

    4.3 用字符串函数连接和分割字符串 4.3.1 使用函数explode()、implode()和join() 4.3.2 使用strtok()函数 4.3.3 使用substr()函数 4.4 字符串的比较 4.4.1 字符串的排序:strcmp()、strcasecmp()和strnatcmp() 4.4.2...

    C#面试题目大全 很实用的

    **问题**: 三种判断字符串是否为空的方法: - `str == ""` - `str == String.Empty` - `str.Length == 0` **解答**: 其中性能最优的是`str.Length == 0`。 - `str == ""`: 这种方式涉及到创建一个空字符串, 并且需要...

    PHP和MySQL Web开发第4版pdf以及源码

    4.3 用字符串函数连接和分割字符串 4.3.1 使用函数explode()、implode()和join() 4.3.2 使用strtok()函数 4.3.3 使用substr()函数 4.4 字符串的比较 4.4.1 字符串的排序:strcmp()、strcasecmp()和strnatcmp() ...

    aardio编程问题集锦与实战

    ### 第33篇 aardio 学习笔记 - 在线程中调用数据 **知识点:** - **线程间通信**: 在不同线程间交换数据的方法。 ### 第34篇 aardio 动态获取网页数据,匹配数据 **知识点:** - **网页数据抓取**: aardio 中如何...

    专高2_练习手册_高性能架构_第07单元1

    Redis 是一个高性能的键值对(key-value)内存数据库,它支持多种数据结构,包括字符串(string)、哈希(hash)、列表(list)、集合(set)和有序集合(sorted set),同时也提供了丰富的操作命令。Redis 的优势在于它的高速...

    PHP和MySQL Web开发第4版

    4.3 用字符串函数连接和分割字符串 4.3.1 使用函数explode()、implode()和join() 4.3.2 使用strtok()函数 4.3.3 使用substr()函数 4.4 字符串的比较 4.4.1 字符串的排序:strcmp()、strcasecmp()和strnatcmp() ...

    Python 从入门到深入.docx

    #### 十三、面向对象编程 - **基本概念** - 类、对象、继承等基本概念。 - **类和对象** - 如何定义类以及如何创建对象。 - **基类和继承** - 类之间的继承关系及其应用。 - **枚举类** - 使用 `enum` 模块定义...

Global site tag (gtag.js) - Google Analytics