Chinaunix首页 | 论坛 | 博客
  • 博客访问: 82369
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 839
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-12 14:38
个人简介

我在收集一些石头,我期待它们有一天能够串联成一串项链。

文章分类

全部博文(31)

文章存档

2013年(31)

我的朋友

分类: Java

2013-04-22 18:11:55

 String vs StringBuffer

JavaString类已经相当完善,但之所以有StringBuffer类的出现是为了弥补String类在其特殊内存机制下在连接操作中出现的确定。

a)         String的内存机制概括起来是“一次投入,终身回报”。JVM在运行时,将内存分为堆和栈,前者存放创建时的对象,后者存放方法调用过程中的局部变量或引用,而堆中又开辟了一块内存,称之为字符串常量池,用来存放特定的字符串对象。在创建字符串时,首先查看字符串常量池中是否存在内容相同的字符串独享,若没有,则新建一对象,否则用该引用指向该对象。由此,在字符串常量池中的字符串对象永远不变,当我们实际进行形如

a)         String s1 = “a”;

b)         String s2 = “b”;

c)           s1 = s1 + s2;

的操作时,实际是将s2的内容追加到s1的内容组成新的内容,查找字符串常量池中是否存在与新内容相同的字符串,若有,则将s1引用指向该对象,否则新建之,再将s1指向新对象。由此带来一好处,不管字符串对象多长,其比较速度一样,但在一些大量需要连接字符串的代码中,其性能将大幅下降,因为其中创建了大量无用的中间对象,如:

a)         String s =””;

b)         For(int i = 0 ; i < 100; i++){

c)            S = s + i ;

d)         }

连接过程中出现很多中间对象,每执行一次连接操作便诞生一个新对象丢弃一个老对象,造成性能急剧下降。

b)            StringBuffer在连接操作时,不产生冗余中间对象,但其创建语法只能通过new操作符进行创建,其append,insert,delete方法可以对StringBuffer对象进行指定操作,然后返回StringBuffer对象,通过toString返回字符串对象。

c)            还有一种称之为StringBuilder的类,其用途和StringBuffer相同,用于字符串的连接和修改,它和StringBuffer的区别是,前者效率更高,但没有同步,多线程下会出错,后者多线程中进行了同步。

阅读(960) | 评论(0) | 转发(0) |
0

上一篇:Java大数计算

下一篇:Java正则表达式

给主人留下些什么吧!~~