美国上市公司,专注Java培训21年

海量字符串如何进行快速操作


【实例描述】

字符串是程序开发中使用最频繁的数据,在Java 中字符串是String 类的对象,它是不可变数据,当执行字符串连接操作时将生成新的字符串,而不是修改原有的字符串,所以大量的字符串操作非常耗时。本实例将分别演示使用String 类与StringBuilder 类进行3 万个字符串追加的操作,并输出其运行时间。我们可以对比两次方法执行的时间。运行效果如图4.26 所示。

图4.26 海量字符串的快速操作

【实现过程】

在Eclipse 中新建项目BuilderString,并在其中创建一个BuilderString.java 文件。在该类的主方法中创建字符串对象appendStr,并通过循环为该字符串连接3 万个字符,计算并输出其用时。再创建StringBuilder 字符串构造器,同样为其追加3 万个字符,计算并输出其用时。核心代码如下所示:

public class BuilderString {
public static void main(String[] args) {
String appendStr = ""; // 创建字符串变量
long startTime = System.nanoTime(); // 开始记事
for (int i = 20000; i < 50000; i++) { // 遍历30000 个字符
appendStr += (char) i; // 字符串与每个字符执行连接操作
}
long endTime = System.nanoTime(); // 结束计时
System.out.println("String 追加字符3 万个。");
// 输出用时
System.out.println("用时:" + (endTime - startTime) / 1000000d + "毫秒
");
StringBuilder strBuilder = new StringBuilder(); // 创建字符串构建器
startTime = System.nanoTime(); // 开始计时
for (int i = 20000; i < 50000; i++) { // 遍历30000 个字符
strBuilder.append((char) i); // 把每个字符追加到构建器
}
endTime = System.nanoTime(); // 结束计时
System.out.println("StringBuilder 字符串构建器追加字符3 万个。");
// 输出用时
System.out.print("用时:" + (endTime - startTime) / 1000000d + "毫秒");
}
}

【代码解析】

从JDK 5.0 开始,Java 增添了一个单个线程使用的等价类,即StringBuilder。通常应该优先使用StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。但是,如果将StringBuilder 的实例用于多个线程是不安全的,这时我们则建议使用StringBuffer。

【知识扩展】

在性能强弱上:StringBuilder>StringBuffer>String。有关这三者的性能问题我们再提示以下几点:

1. 为了获得更好的性能,在构造StringBuffer 或StringBuilder 时应尽可能指定它的容量。当然,如果你操作的字符串长度不超过16 个字符就不用了。

2. 相同情况下使用StringBuilder 与使用StringBuffer 相比,仅能获得10%~15%左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此,除非能确定你的系统瓶颈是在StringBuffer 上,并且确定你的模块不会运行在多线程模式下,否则还是用StringBuffer。

3. 用好现有的类比引入新的类更重要。很多程序员在使用StringBuffer 时是不指定其容量的,如果这样的习惯带StringBuilder 的使用中,只能获得10%左右的性能提升;但如果使用指定容量的StringBuffer,将马上获得45%左右的性能提升,甚至比不使用指定容量的StringBuilder 快30%左右。


【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们会予以重改或删除相关文章,以保证您的权益!

Java开发高端课程免费试学

大咖讲师+项目实战全面提升你的职场竞争力

  • 海量实战教程
  • 1V1答疑解惑
  • 行业动态分析
  • 大神学习路径图

相关推荐

更多
  • 如何应用 if 语句判断某一年是否为闰年?
    如何应用 if 语句判断某一年是否为闰年?
    地球绕太阳一圈称之为一年,所用时间是 365 天 5 小时 48 分 46 秒,取 365 天为一年,4 年将多出 23 小时 15 分 6 秒,将近一天,所以 4 年设一闰日(2 月 29 日),该年称为闰年。如何应用 if 语句判断某一年是否为闰年? 详情>>

    2015-10-22

  • 能正确编译“short s = 1;s = s + 1;”吗?
    能正确编译“short s = 1;s = s + 1;”吗?
    在进行程序设计时,经常需要进行一些算术运算,有的运算能够通过编译器编译,而有的运算则不能通过编译器编译。那么能正确编译“short s = 1;s = s +1;“吗? 详情>>

    2015-10-22

  • java语言中如何修改失败的 if…else 语句?
    java语言中如何修改失败的 if…else 语句?
    判断下列程序代码的运行结果,如何修改代码中的条件判断才能正确执行 if…else语句。 详情>>

    2015-10-22

  • java语言中可以用 switch 分支语句代替 if 条件语句吗?
    java语言中可以用 switch 分支语句代替 if 条件语句吗?
    通常情况下,switch 语句比一系列嵌套的 if 语句更有效,那么是否可以用 switch 分支语句代替 if 条件语句呢? 详情>>

    2015-10-22

  • Java开班时间

    收起