这一条是一个良好的“习惯”,你可能一直没有注意到,但也没出什么问题,但是学会这一条会有不少性能的提高。
两个字符串连接,一般是通过 + 操作符进行的。如
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
分享到:
相关推荐
第三章 Sql查询与函数 一、 SQL概述 SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。同时也是数据库脚本文件的扩展名。 SQL...
使用Apache Commons Lang库中的`StringUtils.join()`方法,可以将数组元素连接成一个字符串,每个元素之间由指定的分隔符隔开: ```java String[] elements = {"a", "b", "c"}; String str = StringUtils.join...
连接两个或多个字符串。例如: ```sql SELECT CONCAT('010-', '88888888') || '转23' AS 高乾竞电话 FROM dual; ``` 输出结果为完整的电话号码。 #### 4. INITCAP 将字符串首字母转换为大写。例如: ```sql SELECT ...
选项D中直接使用字符串连接操作可以提高性能,但不是必须的,因为原代码已经使用了效率较高的`StringBuffer`。 6. `Date`类的默认`toString`方法会生成一个格式化的日期和时间字符串,包括年、月、日、小时、分钟、...
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 ...
- **STRPBRK函数**:查找字符串中第一个出现在另一字符串中的字符。 - **STRRCHR函数**:查找字符串中最后一个匹配的字符。 - **STRSPN函数**:计算一个字符串中包含另一个字符串中的字符的数量。 - **STRSTR函数**...
#### CONCAT函数:字符串连接 `CONCAT`函数用于连接两个或多个字符串。例如,`CONCAT('Hello', 'World')`将返回`'HelloWorld'`。在实际应用中,此函数常用于组合不同的数据字段,如姓名、地址等,形成完整的记录或...
- `strncat(a, b, n)`:将字符串 `b` 的前 `n` 个字符连接到字符串 `a` 的末尾。 - `strcmp(a, b)`:比较字符串 `a` 和 `b`。返回值为 0 表示两字符串相等;如果 `a` 小于 `b`,则返回值小于 0;反之,则返回值...
#### 二、字符串连接 字符串可以通过 `+` 运算符进行连接。例如: ```java String s1 = str1 + "" + str2; // 结果为 "helloworld" ``` #### 三、获取字符串信息 - **字符串长度**:使用 `length()` 方法可以...
3. **减少字符串连接**:使用StringBuilder或StringBuffer进行字符串拼接,而非 "+" 运算符,尤其是在循环中。 4. **合理使用final关键字**:对常量和方法参数使用final,可以提高代码执行效率,允许编译器进行优化...
在Java编程中,由于标准Java库不直接支持串口操作,因此需要依赖第三方库,如RXTXcomm库。RXTX是一个开源项目,提供了一组Java类,使得开发者能够与各种串行和并行端口进行通信,包括读取和写入数据。在描述中提到的...
16. **CONCAT**: 连接两个或多个字符串。 17. **LCASE or LOWER**: 将字符串转换为小写。 18. **UPPER or UCASE**: 将字符串转换为大写。 19. **LEFT**: 返回字符串左边的指定长度的子串。 20. **RIGHT**: 返回...
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...
**问题**: 三种判断字符串是否为空的方法: - `str == ""` - `str == String.Empty` - `str.Length == 0` **解答**: 其中性能最优的是`str.Length == 0`。 - `str == ""`: 这种方式涉及到创建一个空字符串, 并且需要...
4.3 用字符串函数连接和分割字符串 4.3.1 使用函数explode()、implode()和join() 4.3.2 使用strtok()函数 4.3.3 使用substr()函数 4.4 字符串的比较 4.4.1 字符串的排序:strcmp()、strcasecmp()和strnatcmp() ...
### 第33篇 aardio 学习笔记 - 在线程中调用数据 **知识点:** - **线程间通信**: 在不同线程间交换数据的方法。 ### 第34篇 aardio 动态获取网页数据,匹配数据 **知识点:** - **网页数据抓取**: aardio 中如何...
Redis 是一个高性能的键值对(key-value)内存数据库,它支持多种数据结构,包括字符串(string)、哈希(hash)、列表(list)、集合(set)和有序集合(sorted set),同时也提供了丰富的操作命令。Redis 的优势在于它的高速...
4.3 用字符串函数连接和分割字符串 4.3.1 使用函数explode()、implode()和join() 4.3.2 使用strtok()函数 4.3.3 使用substr()函数 4.4 字符串的比较 4.4.1 字符串的排序:strcmp()、strcasecmp()和strnatcmp() ...
#### 十三、面向对象编程 - **基本概念** - 类、对象、继承等基本概念。 - **类和对象** - 如何定义类以及如何创建对象。 - **基类和继承** - 类之间的继承关系及其应用。 - **枚举类** - 使用 `enum` 模块定义...