关于String和StringBuilder、StringBuffer的一个简单性能测试
String a=String b + String c + String d
这种代码在程序里应该随处可见,一部分人不知道这段代码的缺陷在哪,另一部分人知道这样写不好,但是太顺手了下意识就写了。
在Java里,String是个不可变对象,所以右边的每次赋值操作都会new一个新对象,b+c,b+c+d,至少会new两个,很明显性能不佳。但是这个问题没有大多数情况下没我们想象的那么严重,因为编译器在编译时会对String做很多优化,但是对于一些运行时的赋值和修改操作,编译器很难优化,这种时候,就强烈不推荐这样写,虽然写的很顺手 ,但是性能不行,如果存在字符串的修改操作,就应该用StringBuilder和StringBuffer。
下面,就用一个简单的测试,来看看他们之间的性能差别,让我们心里有数。
1. 测试String直接拼接
public static void main(String[] args) {
long begin = System.currentTimeMillis();
String str = "";
for(int i=0;i<10000;i++){
str = str+i;
}
long end = System.currentTimeMillis();
long time = end - begin;
System.out.println(time+"");
}
直接用String的拼接,循环调用10000次,跑出来结果是639毫秒
2.测试String.concat拼接
public static void main(String[] args) {
long begin = System.currentTimeMillis();
String str = "";
for(int i=0;i<10000;i++){
str = str.concat(String.valueOf(i));
}
long end = System.currentTimeMillis();
long time = end - begin;
System.out.println(time+"");
}
也是循环调用10000次,跑出来结果是322毫秒
3.测试StringBuilder拼接
public static void main(String[] args) {
long begin = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for(int i=0;i<10000;i++){
sb.append(i);
}
long end = System.currentTimeMillis();
long time = end - begin;
System.out.println(time+"");
}
}
同样循环调用10000次,结果是5毫秒。换成StringBuffer,结果也是一样。
上面这个简单测试,可以用数据告诉我们,String和StringBuilder、StringBuffer之间的性能差距了,所以如果字符串有变更,都用StringBuilder和StringBuffer,而不是用简单粗暴的赋值操作,另外就是,上面可以看出,String的concat性能也明显优于直接拼接。
关于StringBuilder和StringBuffer
这两个操作可变字符串的类,都实现了AbstractStringBuilder抽象类,接口也几乎一样,他的最大区别是:StringBuffer基本所有方法都做了同步,而StringBuilder没有,换言之,StringBuffer是线程安全的,StringBuilder不是。所以这两个就根据不同的场景做取舍就ok。
谢谢@assiwe提醒,由于编译器本身对String做了足够多的优化,对于简单的String操作,String不比StringBuilder差,因为本身开销都很少,这种时候苛求性能就没太多意义了,只有在我们对String操作的性能敏感的时候,才需要关注他们之间的性能差异,用的时候,要做到心里有数,明白为什么用这个而不用另一个。
关于String和StringBuilder、StringBuffer的一个简单性能测试的更多相关文章
- 数据结构(逻辑结构,物理结构,特点) C#多线程编程的同步也线程安全 C#多线程编程笔记 String 与 StringBuilder (StringBuffer) 数据结构与算法-初体验(极客专栏)
数据结构(逻辑结构,物理结构,特点) 一.数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关.逻辑结构包括: 集合 数 ...
- 18-09-20,String 与 StringBuilder (StringBuffer)
1.其一 在运行速度方面:StringBuilder > StringBuffer > String 上实例 class Program { static void Main(string ...
- JAVA String介绍、常量池及String、StringBuilder和StringBuffer得区别. 以及8种基本类型的包装类和常量池得简单介绍
一.概述 String是代表字符串的类,本身是一个最终类,使用final修饰,不能被继承. 二.定义方式 方式一:直接赋值法 String str1 = "hello"; 方式 ...
- String、StringBuffer和StringBuilder,定义一个自己的StringBuilder的类
String Java中的字符串值属于String类,虽然有其它方法表示字符串(如字符数组),但Java一般使用String类作为字符串的标准格式,Java编译器把字符串值作为String对象; St ...
- 探秘Java中的String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...
- Java中的String、StringBuilder、StringBuffer
可以证明,字符串操作是计算机程序设计中最常见的行为. 一.String 首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象.查看源码就会发现String类为final型的 ...
- 探秘Java中String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...
- Java中String、StringBuilder以及StringBuffer
原文出处: 海子 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffe ...
- Java基础 -- String,StringBuilder,StringBuffer三者的区别
结论 1-String,StringBuilder,StringBuffer 之间的区别主要是在两个方面,即运行速度和线程安全这两方面: 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:St ...
随机推荐
- OPEN(SAP) UI5 学习入门系列之一:扫盲与热身(下)
1 UI5代码结构 上一次我们一起用了20秒的时间完成一个UI5版的Hello World.应用打开后有一个按钮,按钮的文字是Hello World,点击这个按钮之后,按钮会慢慢的消失掉(Fade o ...
- python学习之多线程(二)
使用multiprocessing 使用multiprocessing.dummy 单使用multiprocessing模块的指的是多进程,使用multiprocessing.dummy则表示使用的是 ...
- c++ rapidjson解析多层级json
如果一个层级为data,其内部又包含一个层级status, 可以直接通过这种方式来跨级访问: rapidjson::Value& val_status = doc["data&quo ...
- 并查集实现Tarjan算法
本文是对http://noalgo.info/476.html的一点理解,特别是对其中 int father[mx]: //节点的父亲 int ancestor[mx]; //已访问节点集合的祖先 这 ...
- BZOJ4689 Find the Outlier 【高斯消元】*
BZOJ4689 Find the Outlier Description Abacus教授刚刚完成了一个制作数表的计算引擎的设计.它被设计用于同时计算一个多项式在许多点的取值.例如对于多项式 f(x ...
- BZOJ1026 SCOI2009 windy数 【数位DP】
BZOJ1026 SCOI2009 windy数 Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B ...
- NET Core2基于RabbitMQ对Web前端实现推送功能
NET Core2基于RabbitMQ对Web前端实现推送功能 https://www.cnblogs.com/Andre/p/10012329.html 在我们很多的Web应用中会遇到需要从后端将指 ...
- 如何向map和reduce脚本传递参数,加载文件和目录
本文主要讲解三个问题: 1 使用Java编写MapReduce程序时,如何向map.reduce函数传递参数. 2 使用Streaming编写MapReduce程序(C/C++ ...
- 《DSP using MATLAB》示例 Example 9.6
代码: %% ------------------------------------------------------------------------ %% Output Info about ...
- 《selenium2 python 自动化测试实战》(10)——下拉框和alert
# coding: utf-8 from selenium import webdriverfrom selenium.webdriver.common.action_chains import Ac ...