String a=String b + String c + String d

这种代码在程序里应该随处可见,一部分人不知道这段代码的缺陷在哪,另一部分人知道这样写不好,但是太顺手了下意识就写了。

在Java里,String是个不可变对象,所以右边的每次赋值操作都会new一个新对象,b+c,b+c+d,至少会new两个,很明显性能不佳。但是这个问题没有大多数情况下没我们想象的那么严重,因为编译器在编译时会对String做很多优化,但是对于一些运行时的赋值和修改操作,编译器很难优化,这种时候,就强烈不推荐这样写,虽然写的很顺手 ,但是性能不行,如果存在字符串的修改操作,就应该用StringBuilder和StringBuffer。

下面,就用一个简单的测试,来看看他们之间的性能差别,让我们心里有数。

1. 测试String直接拼接

  1. public static void main(String[] args) {
  2. long begin = System.currentTimeMillis();
  3. String str = "";
  4. for(int i=0;i<10000;i++){
  5. str = str+i;
  6. }
  7. long end = System.currentTimeMillis();
  8. long time = end - begin;
  9. System.out.println(time+"");
  10. }

直接用String的拼接,循环调用10000次,跑出来结果是639毫秒

2.测试String.concat拼接

  1. public static void main(String[] args) {
  2. long begin = System.currentTimeMillis();
  3. String str = "";
  4. for(int i=0;i<10000;i++){
  5. str = str.concat(String.valueOf(i));
  6. }
  7. long end = System.currentTimeMillis();
  8. long time = end - begin;
  9. System.out.println(time+"");
  10. }

也是循环调用10000次,跑出来结果是322毫秒

3.测试StringBuilder拼接

  1. public static void main(String[] args) {
  2. long begin = System.currentTimeMillis();
  3. StringBuilder sb = new StringBuilder();
  4. for(int i=0;i<10000;i++){
  5. sb.append(i);
  6. }
  7. long end = System.currentTimeMillis();
  8. long time = end - begin;
  9. System.out.println(time+"");
  10. }
  11.  
  12. }

同样循环调用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. Python的安装与设置

    1.Python的下载与安装最新的python 版本下载可以去python的网站进行下载 . 考虑系统兼任这里下载32位的Python 双击下载的exe文件进行安装 单击Next 完成Python 安 ...

  2. UISegmentedControl字体大小,颜色,选中颜色,左边椭圆,右边直线的Button 解决之iOS开发之分段控制器UISegmentedControl

        NSArray *segmentedArray = [NSArrayarrayWithObjects:STR(@"Mynews"),STR(@"Systemmes ...

  3. 使用vue

    使用bootstrap npm install bootstrap@3 --save 使用jQuery npm install jQuery --save ---------------- 搭建vue ...

  4. XPath element 格式

    一.xpath表达式的基本格式 xpath通过“路径表达式”(Path Expression)来选择节点. # 斜杠(/)作为路径内部的分割符. # 同一个节点有绝对路径和相对路径两种写法. # 绝对 ...

  5. SQLServer OpenRowSet 导入数据

    今早上同事要求从SQLServer2008导出一部分数据到SQLServer2000中作为演示/测试数据,开始也没想多,直接去SQLServer2000的企业管理器中,用了数据导入的功能.以为完事了, ...

  6. 接口测试基础——第7篇 Python中_、__、__func__之间的区别

    今天的东西很少,主要是给自己做个笔记,顺便帮大家普及一下Python中的边角知识: 1.if __name__ == "__main__"是什么意思 答:一个.py文件,如果是自身 ...

  7. Emgucv3.0的安装与配置

    环境:vs2015+Emgucv3.0 Emgu Cv简介: Emgu CV 是.NET平台下对OpenCV图像处理库的封装.也就是OpenCV的.NET版.它运行在.NET兼容的编程语言下调用Ope ...

  8. 如何理解HTTP协议的 “无连接,无状态” 特点?

    HTTP 是一个属于应用层的面向对象的协议,HTTP 协议一共有五大特点:1.支持客户/服务器模式:2.简单快速:3.灵活:4.无连接:5.无状态. 无连接 无连接的含义是限制每次连接只处理一个请求. ...

  9. 修改selinux出现setsebool: SELinux is disabled.的解决方法

    1.vi /etc/vsftpd/vsftpd.conf # You may specify an explicit list of local users to chroot() to their ...

  10. 关于python中的循环

    参考下面这一篇: http://www.cnblogs.com/vamei/archive/2012/05/30/2526357.html 其中用range的方式最好!