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的一个简单性能测试的更多相关文章

  1. 数据结构(逻辑结构,物理结构,特点) C#多线程编程的同步也线程安全 C#多线程编程笔记 String 与 StringBuilder (StringBuffer) 数据结构与算法-初体验(极客专栏)

    数据结构(逻辑结构,物理结构,特点) 一.数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关.逻辑结构包括: 集合 数 ...

  2. 18-09-20,String 与 StringBuilder (StringBuffer)

    1.其一 在运行速度方面:StringBuilder > StringBuffer > String 上实例 class Program { static void Main(string ...

  3. JAVA String介绍、常量池及String、StringBuilder和StringBuffer得区别. 以及8种基本类型的包装类和常量池得简单介绍

    一.概述 String是代表字符串的类,本身是一个最终类,使用final修饰,不能被继承. 二.定义方式   方式一:直接赋值法 String str1 = "hello"; 方式 ...

  4. String、StringBuffer和StringBuilder,定义一个自己的StringBuilder的类

    String Java中的字符串值属于String类,虽然有其它方法表示字符串(如字符数组),但Java一般使用String类作为字符串的标准格式,Java编译器把字符串值作为String对象; St ...

  5. 探秘Java中的String、StringBuilder以及StringBuffer

    探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...

  6. Java中的String、StringBuilder、StringBuffer

    可以证明,字符串操作是计算机程序设计中最常见的行为. 一.String 首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象.查看源码就会发现String类为final型的 ...

  7. 探秘Java中String、StringBuilder以及StringBuffer

    探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...

  8. Java中String、StringBuilder以及StringBuffer

    原文出处: 海子 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffe ...

  9. Java基础 -- String,StringBuilder,StringBuffer三者的区别

    结论 1-String,StringBuilder,StringBuffer 之间的区别主要是在两个方面,即运行速度和线程安全这两方面: 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:St ...

随机推荐

  1. js工具类的封装

    common.js原生js实现的大多工具方法都将放在common文件中 布局rem.js,vue开发时,我们只需要将rem.js再main.js中import 引入即可 (function(win, ...

  2. [转] Hiredis: redis c client使用注记

    编译 使用 初始化 连接redis数据库 redisContext * pConn = redisConnect(redisIp.c_str(), redisPort);if (m_cLocal == ...

  3. 数据结构(Data Structures)

    一.List数据类型的方法 定义两个list,a和b:a=[1,2,3,4],b=[7,8,9,10] a.append(x)            在a的末尾附加x元素 a.extend(b)   ...

  4. HihoCoder 1044 垃圾清理 (优化:状态压缩)

    状态压缩·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在兑换到了喜欢的奖品之后,便继续起了他们的美国之行,思来想去,他们决定乘坐火车前往下一座城市— ...

  5. POJ3045 Cow Acrobats

    题意 Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away and join t ...

  6. py2exe转换参数

    在公司用python写了个统计数据并通过xlsxwriter模块生成excel的小工具, 完成后使用py2exe转换成exe文件过程中遇到了些问题, 记录下. from distutils.core ...

  7. normalizr api 转换类库使用

    1. 项目初始化 yarn init yarn add normalizr 项目结构 app.js package.json user.json 2. 使用 a. app.js const userj ...

  8. CentOS yum源设定使用方法的整理(转)

    CentOS yum更新了很多版本更新,我本人认为CentOS yum很好使的文件系统,在此向大家推荐CentOS应该是做为服务器的linux的佼佼者.CentOS采用的二进制包是rpm,不过包的依赖 ...

  9. 使用RawComparator加速Hadoop程序

    使用RawComparator加速Hadoop程序 在前面两篇文章[1][2]中我们介绍了Hadoop序列化的相关知识,包括Writable接口与Writable对象以及如何编写定制的Writable ...

  10. 【备忘录】yii2高级模板多个应用启用同一个域名多个栏目

    nginx部署方式,两种写法,本人认为第一种写法没有第二种写法优雅 第一种写法配置文件: server { listen ; server_name youban-dev.jqtest.mopon.c ...