Java字符串连接操作的性能问题
首先,看一段实验程序:
package com.test;
class StringTest {
public static void main(String[] args) {
long start = 0;
long count = 100000;
String str = "test String contact..";
String result = "";
long s1 = System.currentTimeMillis();
while (start < count) {
result+=str;
start++;
}
long e1 = System.currentTimeMillis();
System.out.println("+ 连接执行时间:");
System.out.println(e1 - s1);
start = 0;
str = "test String contact..";
result="";
long s2 = System.currentTimeMillis();
while (start < count) {
result=result.concat(str);
start++;
}
long e2 = System.currentTimeMillis();
System.out.println("contact 连接执行时间:");
System.out.println(e2 - s2);
start = 0;
str = "test String contact..";
result="";
StringBuilder sb = new StringBuilder();
long s3 = System.currentTimeMillis();
while (start < count) {
sb.append(str);
start++;
}
long e3 = System.currentTimeMillis();
System.out.println("stringbuild 连接执行时间:");
System.out.println(e3 - s3);
start = 0;
str = "test String contact..";
result="";
StringBuffer sbu = new StringBuffer();
long s4 = System.currentTimeMillis();
while (start < count) {
sbu.append(str);
start++;
}
long e4 = System.currentTimeMillis();
System.out.println("stringbuffer 连接执行时间:");
System.out.println(e4 - s4);
}
}
上述测试程序的执行结果:
+ 连接执行时间:
156960
contact 连接执行时间:
40896
stringbuild 连接执行时间:
8
stringbuffer 连接执行时间:
7
从结果来看StringBuild连接字符串的效率最高,直接使用加号连接字符串的效率最低。
分析一下上述效率差别之大的原因:
"+"进行字符串连接实际上是在循环内部每次新建StringBuild对象进行字符串的拼接,这样会占用大量内存,jvm内存回收时间不定,导致其执行效率很低;
contact执行过程中也新建了许多内存对象,这是其执行效率低下的主要原因:
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
StringBulid和StringBuffer的执行效率基本一致,综上分析,在大量的字符串拼接处理时,考虑到执行效率,应该使用StringBuild或StringBuffer,尤其是在高并发的场景下性能问题改善尤其明显。
Java字符串连接操作的性能问题的更多相关文章
- php大力力 [024节]PHP中的字符串连接操作(2015-08-27)
2015-08-27 php大力力024.PHP中的字符串连接操作 PHP中的字符串连接操作 阅读:次 时间:2012-03-25 PHP字符串的连接的简单实例 时间:2013-12-30 很多 ...
- 【HANA系列】SAP HANA SQL字符串连接操作
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL字符串连 ...
- Java字符串连接的多种实现方法及效率对比
JDK 1.8(Java 8)里新增String.join()方法用于字符串连接.本文基于<Java实现String.join()和效率比较>一文,分析和比较四种自定义实现与String. ...
- JavaScript中三种字符串连接方式及其性能比较
参考地址: https://www.cnblogs.com/programs/p/5554742.html 工作中经常会碰到要把2个或多个字符串连接成一个字符串的问题,在JS中处理这类问题一般有三种方 ...
- JS中三种字符串连接方式及其性能比较
工作中经常会碰到要把2个或多个字符串连接成一个字符串的问题,在JS中处理这类问题一般有三种方法,这里将它们一一列出顺便也对它们的性能做个具体的比较. 第一种方法 用连接符“+”把要连接的字符串连起来 ...
- JAVA字符串拼接操作规则说明
1.常量与常量的拼接结果在常量池,原理是编译期优化 public void test1() { String s1 = "a" + "b" + "c& ...
- Java字符串连接最佳实践
一个小问题,分享给大家. + 操作和 StringBuilder 都能连接字符串,使用+来拼接字符串,使用javap命令来反编译代码,可以看出实际上编译器会自动创建StringBuilder,调用它的 ...
- SQL语言(二) java怎样连接操作数据库中的数据
import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.S ...
- 【转】Java 字符串常用操作(String类)
原文网址:http://www.cnblogs.com/freeabyss/archive/2013/05/15/3187057.html 字符串查找 String提供了两种查找字符串的方法,即ind ...
随机推荐
- 各版本eclipse的maven配置
1.indgo(3.7) install new software: http://download.eclipse.org/releases/indigo
- Spring中手动增加配置文件中占位符引用的变量
在项目中遇到一个这样的需求,项目的配置文件由外部传入,这时spring配置文件那些占位符变量该如何取值呢? 解决这个问题的做法有几种,我想到的大概有以下三种: 1.通过系统属性来实现,把外部传入的配置 ...
- Python学习之路 (五)爬虫(四)正则表示式爬去名言网
爬虫的四个主要步骤 明确目标 (要知道你准备在哪个范围或者网站去搜索) 爬 (将所有的网站的内容全部爬下来) 取 (去掉对我们没用处的数据) 处理数据(按照我们想要的方式存储和使用) 什么是正则表达式 ...
- python 模拟126邮箱登陆
#coding=utf-8from selenium import webdriverimport time mydriver=webdriver.Firefox()mydriver.get(&quo ...
- NSPredicate的使用
简述 NSPredicate谓词条件过滤器,一般用于过滤数组数据,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取. 常用函数 创建谓词 + (NSPredicate *)predic ...
- 网页里面出现"$#2342"类似这样 应该怎么转义过来?
Python2 from HTMLParser import HTMLParser print HTMLParser().unescape('【竞彩足球')
- [译]新的CCSDS图像压缩推荐标准
摘要——空间数据系统咨询委员会(CCSDS)的数据压缩工作组最近通过了图像数据压缩议案,最终版本预计在2005年发布.议案中采用的算法由两部分组成,先是一个对图像的二维离散小波变换,然后是对变换后的数 ...
- List集合的子类ArrayList和LinkedList
一: 我们常用对集合的操作,查询.增删等操作. 由于集合的存储的方式的不同,导致有些集合查询快但是增删慢.有些集合增删快.但是查询慢. ArrayList:由于ArrayList存储的方式为数组形式. ...
- leetcode589. N-ary Tree Preorder Traversal
python 版: class Solution(object): def preorder(self, root): ret, q = [], root and [root] while q: no ...
- 【C++0x】表达式之类型(decltype)
C++0x引入了新的关键字decltype,它是一个操作符,用来取得表达式的类型,主要在泛型编程中使用.这里,简单介绍一下语法规则. 语法形式:decltype (expression)其中,这里 ...