- 浏览: 326760 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (140)
- oracle (2)
- j2se (18)
- 应用服务器 (2)
- 操作系统 (21)
- j2ee (3)
- web (9)
- Junit (0)
- 项目 (0)
- IDE (0)
- 五花八门 (1)
- excel导入导出 (0)
- DWR (0)
- display标签总结 (0)
- JS (7)
- FCKeditor (0)
- Spring (3)
- webservice (1)
- JVM (14)
- 传输协议 (6)
- maven (3)
- 服务器 (2)
- 数据结构 (11)
- HTTPClient (2)
- JQUERY (9)
- 设计模式 (4)
- 数据库 (6)
- 看书笔记 (0)
- 工具 (4)
- MINA (3)
- mysql (5)
- jetty (1)
- JAVA网络编程 (7)
- Hessian (1)
- ibatis (1)
- socket (4)
- Native (1)
- http (2)
- nosql (2)
- linux (1)
- hadoop (1)
最新评论
-
applezjv:
可以...
maven常见问题 -
andyboy_bin:
p
Jetty -
ye_wx:
...
TableSpace -
ye_wx:
TableSpace -
极限_裁决:
引用第二:不要把“好像”;“有人会……”;“大概”;“晚些时候 ...
可以让你少奋斗10年的工作经验
String和StringBuffer的区别,网上资料可以说是数不胜数,但是看到这篇文章,感觉里面做的小例子很有代表性,所以转一下,并自己做了一点总结。
在java中有3个类来负责字符的操作。
1.Character 是进行单个字符操作的,
2.String 对一串字符进行操作。不可变类。
3.StringBuffer 也是对一串字符进行操作,但是可变类。
String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.
StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过付值符号对他进行付值.
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");
字符串连接操作中StringBuffer的效率要比String高:
String str = new String("welcome to ");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.
并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.
看看以下代码:
将26个英文字母重复加了5000次,
- String tempstr = "abcdefghijklmnopqrstuvwxyz" ;
- int times = 5000 ;
- long lstart1 = System.currentTimeMillis();
- String str = "" ;
- for ( int i = 0 ; i < times; i++) {
- str += tempstr;
- }
- long lend1 = System.currentTimeMillis();
- long time = (lend1 - lstart1);
- System.out.println(time);
可惜我的计算机不是超级计算机,得到的结果每次不一定一样一般为 46687左右。
也就是46秒。
我们再看看以下代码
- String tempstr = "abcdefghijklmnopqrstuvwxyz" ;
- int times = 5000 ;
- long lstart2 = System.currentTimeMillis();
- StringBuffer sb = new StringBuffer();
- for ( int i = 0 ; i < times; i++) {
- sb.append(tempstr);
- }
- long lend2 = System.currentTimeMillis();
- long time2 = (lend2 - lstart2);
- System.out.println(time2);
得到的结果为 16 有时还是 0
所以结论很明显,StringBuffer 的速度几乎是String 上万倍。当然这个数据不是很准确。因为循环的次数在100000次的时候,差异更大。不信你试试。
根据上面所说:
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
所以str += "here";可以等同于
StringBuffer sb = new StringBuffer(str);
sb.append("here");
str = sb.toString();
所以上面直接利用"+"来连接String的代码可以基本等同于以下代码
- String tempstr = "abcdefghijklmnopqrstuvwxyz" ;
- int times = 5000 ;
- long lstart2 = System.currentTimeMillis();
- String str = "" ;
- for ( int i = 0 ; i < times; i++) {
- StringBuffer sb = new StringBuffer(str);
- sb.append(tempstr);
- str = sb.toString();
- }
- long lend2 = System.currentTimeMillis();
- long time2 = (lend2 - lstart2);
- System.out.println(time2);
平均执行时间为46922左右,也就是46秒。
总结: 如果在程序中需要对字符串进行频繁的修改连接操作的话.使用StringBuffer性能会更高
而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的: String S1 = “This is only a” + “ simple” + “ test”; StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”); 你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个 String S1 = “This is only a” + “ simple” + “test”; 其实就是: String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如: String S2 = “This is only a”; String S3 = “ simple”; String S4 = “ test”; String S1 = S2 +S3 + S4; 这时候 JVM 会规规矩矩的按照原来的方式去做
发表评论
-
java枚举Enum
2013-01-14 14:43 1177public class TestEnum { /* ... -
Java 动态代理机制分析及扩展,第 1 部分
2012-03-26 12:47 747引言 Java 动态代理机制的出现,使得 Java 开 ... -
详解reflect Java的反射机制
2012-03-23 13:09 991一、类型识别的两种方式: 首先了解一下“运 ... -
Annotation 之 jdk1.5内建的Annotation实例
2011-11-15 20:25 851一、限定Override父类方法@Override ja ... -
自定义Annotation
2011-11-15 20:24 691自定义Annotation 自定义Annotation早 ... -
Java Annotation
2011-11-14 22:04 0Java Annotation手册 ... -
集合类源码
2011-11-06 04:04 979主要包括Java类库中提供的几个具体的类: LinkedLis ... -
ArrayList和Vector以及HashTable和HashMap区别
2011-10-12 10:40 975ArrayList和Vector以及HashTable和Has ... -
JVM优化配置
2011-08-20 22:32 807JVM 优化配置 ... -
JVM慢慢琢磨
2011-08-20 22:05 898原文:http://www.iteye.com/ ... -
堆栈区别
2011-08-18 22:23 828原文:http://www.iteye.com/topi ... -
JVM闲谈
2011-08-18 22:01 757java中内存分为堆内存和栈内存。 Java把内存划分成两 ... -
堆和栈的区别
2011-08-03 00:27 824堆和栈的区别 一、预备知识—程序的内存分配 一个由 ... -
JVM 四
2011-08-02 18:22 754转自:http://blog.csdn.net/cute ... -
JVM
2011-08-02 18:20 164本文转自:http://blog.csdn.net/cu ... -
关于byte
2011-08-02 18:16 9841GB=1024MB=1024*1024KB=1024*102 ... -
jvm垃圾回收
2011-07-31 23:13 714Java里的对象并非总是被 ... -
序列化
2009-10-11 22:13 1730序列化 (serialization) 将对象的状 ... -
去字符串中的回车 换行 空格的方法
2009-10-09 17:37 0import java.util.List; import ... -
去字符串中的回车 换行 空格的方法
2009-10-09 17:37 0import java.util.List; import ...
相关推荐
String,StringBuffer,StringBuilder区别。几乎所有的应用开发都离不开操作字符串,理解字符串的设计和实现以及相关 工具如拼接类的使用,对写出高质量代码是非常有帮助的
NULL 博文链接:https://coderdream.iteye.com/blog/845822
JAVA中String与StringBuffer的区别 JAVA中String与StringBuffer的区别 自己的学习笔记总结
详解string与stringbuffer的区别,详述了String 是不可变,以及他们的再字符串连接时的效率区别!
string和StringBuffer的区别
StringBuffer:字符创变量 StringBuilder:字符创变量 从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:
String StringBuffer和StringBuilder 区别之源码解析 从源码角度简单对它们之间的区别进行了验证
String ,StringBuffer与StringBuilder的区别
String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别
java面试笔试题String 和StringBuffer的区别
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了数值不可改变的字符串.而这个StringBuffer类提供的字符串进行修改.当你知道字符数据要改变的时候...
从非常细致的角度分析了String和Stringbuffer的主要区别
String及StringBuffer和StringBuilder的区别
介绍了String、StringBuffer、StringBuilder的使用方法,以及理论知识
String的效率低于StringBuffer,开发时最好选用StringBuffer。
简单的介绍了String、StringBuffer和StringBuilder的区别
针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍...
StringBuffer和String_区别 java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的...
Java中String,StringBuffer与StringBuilder的区别和用法。