StringStringBufferStringBuilder三者之间的区别.docxVIP

  • 2
  • 0
  • 约8.67千字
  • 约 9页
  • 2017-10-22 发布于北京
  • 举报

StringStringBufferStringBuilder三者之间的区别.docx

StringStringBufferStringBuilder三者之间的区别

1. String类是不可变类,任何对String的改变都会引发新的String对象的生成;而StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象. 当改变字符串内容时,采用StringBuffer能获得更好的性能。既然是为了获得更好的性能,那么采用 StringBuffer能够获得最好的性能吗?答案是NO!为什么?如果你读过《Think in Java》,而且对里面描述HashTable和HashMap区别的那部分章节比较熟悉的话,你一定也明白了原因所在。对,就是支持线程同步保证线程安 全而导致性能下降的问题。HashTable是线程安全的,很多方法都是synchronized方法,而HashMap不是线程安全的,但其在单线程程 序中的性能比HashTable要高。StringBuffer和StringBuilder类的区别也在于此,新引入的StringBuilder类不 是线程安全的,但其在单线程中的性能比StringBuffer高。 将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer 2.StringBuffer和StringBuilder的区别? StringBuffer 是线程安全的 StringBuilder 不保证线程安全(在1.5中引入的),一般情况下比StringBuffer快。 你的java正常运行是什么意思?你在ie中安装了jdk吧? 【weiqiyiji】: 就是我说我把环境变量classpath删除,然后把path里的Java部分的内容去掉后,写的Java程序一样通过编译,一样可以运行。这跟IE有什么关系? 我的浏览器也不是ie 【gongyali2005】: 线程安全否? 【bao110908】: 不会吧,你是使用手工进行编译的?不说其他的,把 path 中关于 Java 的都去掉,javac 就没有办法用了! 【phoenixsbk】: 一样可以用的 【qq7338367】: 一个String对象的长度是固定的,不能改变它的内容,或者是附加新的字符至String对象中。您也许会使用+来串联字符串以达到附加新字符或字符串 的目的,但+会产生一个新的String实例。如果程序对这种附加字符串的需求很频繁,并不建议使用+来进行字符串的串联。在面向对象程序设计中,最好是 能重复运用已生成的对象,对象的生成需要内存空间与时间,不断地产生String实例是一个没有效率的行为。 J2SE 5.0提供java.lang.StringBuilder类,使用这个类所产生的对象默认会有16个字符的长度,您也可以自行指定初始长度。如果附加的 字符超出可容纳的长度,则StringBuilder对象会自动增加长度以容纳被附加的字符。如果有频繁作字符串附加的需求,使用 StringBuilder会让程序的效率大大提高。通过下面的简单测试程序就可以知道效能差距有多大。 ü 范例6.5?? AppendStringTest.java??????????????????????????????????????????????????????? public class AppendStringTest { ???? public static void main(String[] args) { ???????? String text = ; ???????? long beginTime = System.currentTimeMillis(); ???????? for(int i = 0; i 10000; i++) ???????????? text = text + i; ???????? long endTime = System.currentTimeMillis(); ???????? System.out.println(执行时间: + (endTime - beginTime)); ???????? StringBuilder builder = new StringBuilder(); ???????? beginTime = System.currentTimeMillis(); ???????? for(int i = 0; i 10000; i++) ???????????? builder.append(String.valueOf(i)); ???????? endTime = System.currentTimeMillis(); ???????? System.out.println(执行时间: + (endTime - beginTime));

文档评论(0)

1亿VIP精品文档

相关文档