[转载] 整理下java中stringBuilder和stringBuffer两个类的区别

参考链接: Java中的StringBuffer类

StringBuilder和StringBuffer这两个类在动态拼接字符串时常用,肯定比String的效率和开销小,这是因为String的对象不会回收哦。 

 其实我一直用StringBuilder这个类,因为可以简写为sb的变量在程序里很爽,可是后来师兄说web程序特别是高并发的程序中不要用stringbuilder,因为简单说,stringBuilder不是线程安全的,而StirngBuffer就是线程安全的。从网上看到Stringbuffer中方法大都采用了synchronized的关键字修饰。 

 来来来,我们先复习下syncronized的用法,有篇博客写的挺好的,给个链接 http://leo-faith.iteye.com/blog/177779 

  

 

  1、synchronized关键字的作用域有二种: 1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法; 2)是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。

 

   

 

  2、除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/},它的作用域是当前对象;

 

 

 

  3、synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法;

 

 好了,言归正传,我们继续StringBuffer和StringBuilder的区别。 

 就是说,StringBuffer中所有的方法都要加锁,所以好多操作看上去都是线性操作的。所以要慢些。 

  

 

  一般情况下,速度从快到慢:StringBuilder>StringBuffer>String.当需要在循环中多次使用字符串拼接时,建议使用StringBuilder或StringBuffer.当数量级在百万级(这里可能不准确)时,StringBuilder的速度会体现出来.

 

 

以下是实验数据 

  

  

 

  

   

    01 final static int ttime = 30000;// 测试循环次数 

   

   

    02   

   

   

    03     public void test(String s) { 

   

   

    04         long begin = System.currentTimeMillis(); 

   

   

    05         for (int i = 0; i < ttime; i++) { 

   

   

    06             s += "add"; 

   

   

    07         } 

   

   

    08         long over = System.currentTimeMillis(); 

   

   

    09         System.out.println(" 操作 " + s.getClass().getName() + " 类型使用的时间为: " + (over - begin) + " 毫秒 "); 

   

   

    10     } 

   

   

    11   

   

   

    12     public void test(StringBuffer s) { 

   

   

    13         long begin = System.currentTimeMillis(); 

   

   

    14         for (int i = 0; i < ttime; i++) { 

   

   

    15             s.append("add"); 

   

   

    16         } 

   

   

    17         long over = System.currentTimeMillis(); 

   

   

    18         System.out.println(" 操作 " + s.getClass().getName() + " 类型使用的时间为: " + (over - begin) + " 毫秒 "); 

   

   

    19     } 

   

   

    20   

   

   

    21     public void test(StringBuilder s) { 

   

   

    22         long begin = System.currentTimeMillis(); 

   

   

    23         for (int i = 0; i < ttime; i++) { 

   

   

    24             s.append("add"); 

   

   

    25         } 

   

   

    26         long over = System.currentTimeMillis(); 

   

   

    27         System.out.println(" 操作 " + s.getClass().getName() + " 类型使用的时间为: " + (over - begin) + " 毫秒 "); 

   

   

    28     } 

   

   

    29   

   

   

    30     // 对 String 直接进行字符串拼接的测试 

   

   

    31     public void test2() { 

   

   

    32         String s2 = "abadf"; 

   

   

    33         long begin = System.currentTimeMillis(); 

   

   

    34         for (int i = 0; i < ttime; i++) { 

   

   

    35             String s = s2 + s2 + s2; 

   

   

    36         } 

   

   

    37         long over = System.currentTimeMillis(); 

   

   

    38         System.out.println(" 操作字符串对象引用相加类型使用的时间为: " + (over - begin) + " 毫秒 "); 

   

   

    39     } 

   

   

    40   

   

   

    41     public void test3() { 

   

   

    42         long begin = System.currentTimeMillis(); 

   

   

    43         for (int i = 0; i < ttime; i++) { 

   

   

    44             String s = "abadf" + "abadf" + "abadf"; 

   

   

    45         } 

   

   

    46         long over = System.currentTimeMillis(); 

   

   

    47         System.out.println(" 操作字符串相加使用的时间为: " + (over - begin) + " 毫秒 "); 

   

   

    48     } 

   

   

    49   

   

   

    50     public static void main(String[] args) { 

   

   

    51         String s1 = "abc"; 

   

   

    52         StringBuffer sb1 = new StringBuffer("abc"); 

   

   

    53         StringBuilder sb2 = new StringBuilder("abc"); 

   

   

    54         Test t = new Test(); 

   

   

    55         t.test(s1); 

   

   

    56         t.test(sb1); 

   

   

    57         t.test(sb2); 

   

   

    58         t.test2(); 

   

   

    59         t.test3(); 

   

   

    60     } 

   

  

 

  

试验结果如下: 

  

  

  操作 java.lang.String 类型使用的时间为: 2432 毫秒  

  操作 java.lang.StringBuffer 类型使用的时间为: 3 毫秒  

  操作 java.lang.StringBuilder 类型使用的时间为: 3 毫秒  

  操作字符串对象引用相加类型使用的时间为: 6 毫秒  

  操作字符串相加使用的时间为: 1 毫秒  

  

 把循环次数调的很大,试了用下jconsle来监视内存GC,第一次使用,不太明白,有个博客写的很好的,有空研究一下 

  http://jiajun.iteye.com/blog/810150 

 再补充一个Jstat的工具 http://xiaolele.iteye.com/blog/592022 

 /** 

 *20120516昨天忘看源代码了 

 **/ 

 StringBuffer中append方法有很多重载,有synchronized关键字没错,主要调用的还是AbstractStringBuilder的super的方法。 

  

 

  

   

    1 public synchronized StringBuffer append(String s) 

   

   

    2 { 

   

   

    3     super.append(s); 

   

   

    4     return this; 

   

   

    5 } 

   

  

 

  

父类的方法为 

  

 

  

   

    01 public AbstractStringBuilder append(String s) { 

   

   

    02   

   

   

    03     if (s == null) 

   

   

    04         s = "null"; 

   

   

    05     int i = s.length(); 

   

   

    06     if (i == 0) 

   

   

    07         return this; 

   

   

    08     int j = count + i; 

   

   

    09     if (j > value.length) 

   

   

    10         expandCapacity(j); 

   

   

    11     s.getChars(0, i, value, count); 

   

   

    12     count = j; 

   

   

    13     return this; 

   

   

    14 } 

   

  

 

  

  

 StringBuilder类中的append就没有同步的关键字了。父类的方法基本上差不多。 

 总结一下,StringBuffer线程安全,内部有synchronized方法,StringBuilder是1.5之后出来的,高并发就不要用了。另外synchronized的使用要熟悉,以后研究下java内存的工具,比如jconsle。 

   

 转载:http://my.oschina.net/zimingforever/blog/57514

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11.13 模10计数器设计

.新建一个工程 Family&#xff1a;FLEX10K Available device&#xff1a;EPF10K20TC144-3 2.设置lpm_counter宏单元参数并连接引脚 连接引脚的时候要注意的是&#xff0c;向量线的连接。 3.时序仿真 检查无误后进行下一步 4.载入7448并进行引脚连接 5.分配管脚 再次编译&#x…

[转载] java对象在内存中的结构

参考链接&#xff1a; 了解Java中的类和对象 今天看到一个不错的PPT&#xff1a;Build Memory-efficient Java Applications&#xff0c;开篇便提出了一个问题&#xff0c;在Hotspot JVM中&#xff0c;32位机器下&#xff0c;Integer对象的大小是int的几倍&#xff1f; 我们…

使用valueOf前必须进行校验

每个枚举都是java.lang.Enum的子类,都可以访问Enum类提供的方法,比如hashCode(),name(),valueOf()等..... 其中valueOf()方法会把一个String类型的名称转变为枚举项,也就是枚举项中查找出字面值与该参数相等的枚举项,虽然这个方法很简单,但是JDK却做了一个对于开发人员来说并不…

[转载] 【Java】Java基础知识及其扩展笔记(8千字)

参考链接&#xff1a; Java中的StringBuilder类及其示例 Java基础知识及其扩展笔记 零 l 写在前面一 l JVM1、【1.1.2.1】java程序运行的一般流程2、【1.1.2.1】JVM一般运行流程3、【1.1.2.1】JIT&#xff08;just in time 即时编译编译器&#xff09;4、堆与栈 二 l Java …

多IDC GSLB的部署

之前已经介绍过GSLB的实现原理&#xff0c;这里再向大家讲述一下GSLB经常遇到的部署方式&#xff0c;多IDC的部署。很多大型的企业或业务容灾要求非常高的客户都会部署有多个异地的数据中心&#xff0c;以保证其业务的“全天候”不间断的正常运行&#xff0c;而要整合多个IDC的…

[转载] Controller报错:java.lang.NoSuchMethodException: java.util.List.<init>()

参考链接&#xff1a; Java8中的java.util.StringJoiner 报错详情&#xff1a; java.lang.NoSuchMethodException: java.util.List.<init>() 以及 No primary or default constructor found for interface java.util.List 示例&#xff1a; /** * 此接口会产生以…

[转载] 算法竞赛中的JAVA使用笔记

参考链接&#xff1a; Java中StringTokenizer类的示例| 1(构造函数) 算法竞赛中的JAVA使用笔记 算法竞赛中的JAVA使用笔记 输入与输出 基本输入输入挂输出控制台输入输出重定向到文件 大整数与高精度 大整数BigInteger高精度BigDecimal高精度开方 字符串与进制转换 字符串基本…

信息系统开发平台OpenExpressApp:【OpenTest】 之 语法及其使用介绍

在OpenTest 之 运行环境准备中介绍了运行自动化测试需要做的一些准备工作&#xff0c;本篇将继续给大家介绍OpenTest的脚本语法以及使用方法&#xff0c;通过学习后读者应该能够开始动手编写UI自动化测试脚本了。 关键字驱动测试 在学习语法之前&#xff0c;需要了解一下关键字…

[转载] java常量池-字符串常量池、class常量池和运行时常量池

参考链接&#xff1a; 如何在Java中初始化和比较字符串 原文链接&#xff1a;http://tangxman.github.io/2015/07/27/the-difference-of-java-string-pool/ 在java的内存分配中&#xff0c;经常听到很多关于常量池的描述&#xff0c;我开始看的时候也是看的很模糊&#xff0c…

Oracle 10g 高级安装图文教程(二)

第八步&#xff1a;为了简便起见&#xff08;工作中肯定不安全&#xff09;&#xff0c;选择“所有的帐户都是用同一个口令”&#xff0c;并输入口令&#xff0c;点击“下一步”&#xff1a;本文转自 victoryan 51CTO博客&#xff0c;原文链接:http://blog.51cto.com/victoryan…

[转载] StringBuffer和StringBuilder类

参考链接&#xff1a; Java中的String vs StringBuilder vs StringBuffer 下述文章资料来源于&#xff1a; W3CSCHOOL离线版的Java教程 Java JDK 6.0开发手册 Java开发从入门到精通(陈小玉版) StringBuffer和String选择的异同 StringBuffer在进行字符串处理时&#xff0c;不…

sharepoint 2007功能增强解决方案,资料收集

一、关于QuickFlow&#xff0c;sharepoint可视化工作流增强包 http://www.cnblogs.com/jianyi0115/tag/QuickFlow/default.html?page1 http://quickflow.codeplex.com/ 二、关于SharePoint Permission Extension&#xff0c;视图、列表字段权限功能增强 http://sppex.codeplex…

[转载] 面试题:说说Java中接口、类、成员变量、成员方法、构造方法有哪些访问修饰符和他们的作用范围

参考链接&#xff1a; Java中的访问修饰符 * 问题&#xff1a;说说Java中接口、类、成员变量、成员方法、构造方法有哪些访问修饰符和他们的作用范围 * 答&#xff1a;接口的访问修饰符只有public 1个 * 类的访问修饰符有public和默认(就是不写的)2个 * 成员方法的访问修…

使用IHttpHandler做权限控制[ASP.NET | IHttpHandler | AjaxPro | UserHostName]

正文 Web.Config配置如下: <add verb"POST,GET"path"/page/*.aspx,/page/*/*.aspx,/page/*/*/*.aspx,/page/*/*/*/*.aspx,/page/*/*/*/*/*.aspx"type"WebLibrary.PowerManage.HttpHanderPowerControls"/> 整个IHttpHandler实现代码如下: /…

[转载] Java 中字符串转整型和整型转字符串

参考链接&#xff1a; Java中的字符串到整数– parseInt() Java 中字符串转整型和整型转字符串 1.字符串转整型Java代码&#xff0c;字符串为纯数字的情况下&#xff0c;调用Integer的静态方法parseInt或者valueOfJava代码&#xff0c;如果单个字符或字符串&#xff0c;需要切…

Gram matrix 格拉姆矩阵

2019独角兽企业重金招聘Python工程师标准>>> Gram matrix 度量各个维度自己的特性以及各个维度之间的关系。 来自&#xff1a;https://www.zhihu.com/question/49805962?fromprofile_question_card 由感知机&#xff08;对偶感知机中需要计算样本点两两之间的内积和…

[转载] 用Java语言实现对十六进制字符串异或运算

参考链接&#xff1a; 交换两个字符串&#xff0c;而无需在Java中使用第三个用户定义的变量 前言&#xff1a;好久没有写博客&#xff0c;最近一年感觉真是好忙&#xff0c;各种做不完的工作。相信很多上班族都会有这种感觉。最近对NFC进行写卡操作&#xff0c;需要计算一个校…

MySQL日常应用操作记录

1.知道一个字段名&#xff0c;怎样查到它在数据库里的哪张表里&#xff1f; USE Information_schema;SELECT TABLE_NAME FROM COLUMNS WHERE COLUMN_NAME字段名称; MySQL中查看库表字段信息都在information_schemal中&#xff0c;获取数据字典等信息都要通过这个视图。 如&…

[转载] 【Java】将一个字符串的字符排序,按ASCII表的顺序从小到大

参考链接&#xff1a; 在Java中搜索字符串中的字符和子字符串 将一个字符串的字符按ASCII表的顺序从小到大排序&#xff0c;如将字符串“asdafxcvMADb”排序为“ADMaabcdfsvx” 算法的基本思想&#xff1a; 先将字符串转化为一个char类型的数组&#xff0c;来进行存储&#xf…

如果只做前端验证的话,谈jjdd.com的看照片功能。

如果你在上海&#xff0c;并且坐过地铁的话&#xff0c;你肯定知道jjdd.com。 这个网站和百合&#xff0c;世纪佳缘类似&#xff0c;都是交朋友的性质。 在jjdd.com中有个很重要的功能&#xff1a;如果你上传的照片比你想看的人少的话&#xff0c;你是不能看她的照片的。 例如如…