[Java Performance] 字符串拼接注意事项

  • 字符串拼接(String Concatenation)

    // 编译器优化前
    String answer = integerPart + "." + mantissa;
    
    // 编译器优化后
    String answer = new StringBuilder(integerPart).append(".").append(mantissa).toString();

    因为编译器会对字符串的拼接操作进行优化,所以在同一条语句中使用字符串拼接操作对性能并没有负面影响。正因为编译器在幕后的优化,在任何场景下都使用StringBuilder替代“+”操作符来进行字符串拼接是没有必要的。

    但是,当字符串的拼接是由多条语句(或者循环)完成的,就有问题了:

    // 编译器优化前
    String answer = integerPart;
    answer += ".";
    answer += mantissa;
    
    // 编译器优化后
    String answer = new StringBuilder(integerPart).toString();
    answer = new StringBuilder(answer).append(".").toString();
    answer = new StringBuilder(answer).append(mantissa).toString();

    被编译器优化的代码中,中间的String对象以及StringBuilder对象实际上都是不需要的。此时,可以考虑将以上的拼接语句合并成一条拼接语句。或者直接显式地使用StringBuilder对象。

总结

  1. 当字符串拼接使用一条语句完成时,性能和使用StringBuilder时相当。
  2. 对于使用多条语句完成字符串拼接时,考虑合并这些语句或者显式使用StringBuilder。
时间: 2024-10-08 23:43:47

[Java Performance] 字符串拼接注意事项的相关文章

java中字符串拼接 String 和 StringBuilder(StringBuffer)的使用

字符串拼接是个常用的功能,经常性使用String做字符串拼接,当拼接次数多的时候,使用String方法会消耗大量的性能和时间,因为每次String拼接时都会建立一个新的对象,随着拼接次数的增多,性能消耗.时间消耗会大量增加,这个时候应该使用StringBuilder方法. 1 public static void main(String[] args) { 2 try { 3 int count = 500; 4 5 long begin = System.currentTimeMillis()

java用字符串拼接SQL语句的特殊字符转义问题

在实际的项目开发中,往往会根据用户在界面的文本框中输入的信息,去数据库中做模糊查询.如果使用的是原始的JDBC和SQL,往往需要对用户的输入进行转义,避免生成的sql语法错误,或者防止SQL注入.比如对输入的%和_和',就需要进行转义,因为这3个字符是SQL的特殊字符,如果不处理会导致sql出错或者是查询数据不正确. 假如有这样1个查询请求,模糊查询标题中包含a%b_cc'd的记录,正确的sql应该是下面这样的: select * from t_sch_work_info t where t.t

字符串拼接与性能分析

原文出处:http://www.venishjoe.net/2009/11/java-string-concatenation-and.html转自:http://coolshell.cn/articles/2235.html 概述:本文主要研究的是JAVA的字符串拼接的性能,原文中的测试代码在功能上并不等价,导致concat的测试意义不大.不过原作者在评论栏给了新的concat结果,如果有兴趣的同学建议自己修改代码测试. 在JAVA中拼接两个字符串的最简便的方式就是使用操作符”+”了.如果你用

【转】Java 5种字符串拼接方式性能比较。

最近写一个东东,可能会考虑到字符串拼接,想了几种方法,但对性能未知,于是用Junit写了个单元测试. 代码如下: import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TestS

LotusScript提升大字符串拼接函数(功能类似java中StringBuffer)

LotusScript提升大字符串拼接函数(功能类似java中StringBuffer),代码如下: Class StringBuffer Public count As Integer Private arr() As String Private size As Integer Private increment As Integer Sub New(Byval a As Integer) Redim arr(a) increment=a count=0 End Sub Sub add(By

java 字符串拼接的单元测试

整体内容介绍 本文分为几个部分: * String.StringBuffer.StringBuilder的对比 * 字符串拼接方式的对比 使用到的内容: * Junit4单元测试 * slf4j的日志框架 String.StringBuffer.StringBuilder的对比 对于这三者使用的场景做如下概括(参考:<编写搞质量代码:改善java程序的151个建议>): String:在字符串不经常变化的场景中可以使用String类,如:常量的声明.少量的变量运算等. StringBuffer

java 创建string对象机制 字符串缓冲池 字符串拼接机制 字符串中intern()方法

字符串常量池:字符串常量池在方法区中 为了优化空间,为了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,每当代码创建字符串常量时,JVM会首先检查字符串常量池.如果字符串已经存在池中,就返回池中的实例引用.如果字符串不在池中,就会实例化一个字符串并放到池中.Java能够进行这样的优化是因为字符串是不可变的,可以不用担心数据冲突进行共享.所以,在常量池中的这些字符串不会被垃圾收集器回收 1.String str = new String("hello");此时创建的2个对象

【Java】字符拼接成字符串的注意点

这两天敲代码的时候,偶然间发现一个好玩的事情,分享一下,记录一下. 该段代码主要是:先产生的几个整数,把整数转换成对应的字符,最后的字符拼接成字符串,在把字符拼接成字符串的时候,个人因为偷懒使用+号进行操作,出现了一点小惊喜.拼接以后出现了两种不同的结果,感到十分的意外,所以分析了一下出现的结果,记录一下. 1 package top.supertd.www; 2 3 import java.util.concurrent.ThreadLocalRandom; 4 5 public class

Java中字符串的拼接和转义

Java中字符串的拼接和转义 package com.testToken.demo; public class Test { public static void main(String[] args) { String str="Apple"; System.out.println(str); String str2="\"Apple\""; //输出"Apple" System.out.println(str2); Str