关闭

Java的字符类String、StringBuffer与StringBuilder异同对比分析

标签: Java
4941人阅读 评论(11) 收藏 举报
分类:
Java的字符类String、StringBuffer与StringBuilder异同对比分析


Java String是一个“不可变常量字符串”对象,final属性定义。之所以这么说,是从String内部在盛放字符串时候的容器char数组而言。比如当用户在初始化阶段定义了一个String对象String s=”hello,world!”,而此时再次对s进行操作改变s的值时候,如再次给s赋值使得s=”zhangphil”,那么Java的JVM其实是再次创建了一个新的String对象,然后移动指针s指向了新的String对象(对象内部的字符串是“zhangphil”)。由此可见,假如在代码中需要频繁的修改String对象中的字符内容,那么应该尽量避免使用String,原因在于每一次修改String内容后,其实就是JVM在内存堆上创建了一个新的String对象,由此导致的问题有三:
(一)如果代码中的String对象频繁的修改,表面仍然是在一个String对象中修改赋值,但其实底层的JavaJVM在内存的堆上创建了更多新的String对象,同时与之相伴随的是更多死去的String对象,此过程简单总结就是Java JVM在频繁的创建对象,也产生死去的对象,即,生成一个新的String对象,死去一个String对象。这样将产生大量JVM内存碎片,极大概率提高Java了系统触发Java GC的时机,由此降低了系统性能 。
(二)String对象的产生、赋值修改操作过程是多线程不安全操作,原因如前所述,每一次对String对象的赋值、操作,导致Java JVM在底层创建了新的String对象,在操作系统的CPU时机片上,线程不保证安全。如果多线程在操作此String对象,那么就极有可能在操作系统调度切换CPU时间片时,操作的目标对象不一致,有的指向新的String s对象,有的线程却仍指向旧的String s对象。
(三)每一次修改赋值String s对象,是创建了新的String对象,然后把新的对象引用赋给s。这个操作是在堆上创建 ,若频繁操作,势必造成较大系统开销。
小结:如果是在代码启动后,String对象不再修改重新赋值,那么可以考虑使用String,比如在代码中定义一些public static final String常量。如果需要在代码中频繁修改和赋值操作字符串对象具体内容,建议使用StringBuffer。
不同于String字符串常量,StringBuffer是字符串变量。StringBuffer不会产生String那样的问题:每一次修改就重新创建一个新的String对象。在某种程度上讲,StringBuffer内部维持一个可变长度的char数组盛放用户字符数据,因此StringBuffer是线程安全的。由于StringBuffer是在一个字符char数组进行原子赋值、操作,不是像String那样以“乾坤大挪移”的方式改变引用进行字符串赋值、操作,在理论上讲,字符的操作层面,StringBuffer的性能优于String。
StringBuilder是在后续新版Java中引入的字符类,StringBuilder和StringBuffer类似,均是字符串变量,但是StringBuilder多线程不安全,而单线程安全,StringBuilder在单线程中性能优于StringBuffer,所,如果仅仅是在单线程中使用字符串变量,优先可考虑使用StringBuilder。
15
3
查看评论

String/StringBuffer/StringBuilder区别

参考:http://blog.csdn.net/rmn190/article/details/1492013 String字符串常量 StringBuffer字符串变量(线程安全) StringBuilder字符串变量(非线程安全) 简要的说,String类型和StringBuffer类型的主要性能...
  • pymqq
  • pymqq
  • 2015-07-23 22:23
  • 607

String,StringBuffer, StringBuilder类的常用方法

一、String类的常用方法1.获取: 1)获取字符串str长度 int i = str.length(); 2)根据位置(index)获取字符 char c = str.charAt(inde...
  • zhao_yu_lei
  • zhao_yu_lei
  • 2017-05-12 13:38
  • 803

Java基础之String、StringBuffer与StringBuilder的区别及应用场景

1 String、StringBuffer与StringBuilder (1)String 字符串常量; /** Strings are constant; their values cannot be changed after they * are created. String bu...
  • chenliguan
  • chenliguan
  • 2016-07-14 18:35
  • 6315

String/StringBuffer/StringBuilder对比

java当中的字符串涉及到三个类String、StringBuffer和StringBuilder,他们特点不同,使用的场景也不同。
  • m0_37241851
  • m0_37241851
  • 2017-05-01 15:40
  • 202

String StringBuilder StringBuffer 对比 总结得非常好

转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论。还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸裸的站在我们这些Java色狼面前了。嘿嘿.... 众所周知,
  • clam_clam
  • clam_clam
  • 2011-09-28 19:00
  • 33241

Java中String,StringBuffer,StringBuilder常用方法及使用实例

package stringtest; public class StringOpera { public static void main(String[] args) { String[] str1 = { "NBA", "ABC", &qu...
  • u012768347
  • u012768347
  • 2017-03-12 16:33
  • 494

Java中String、StringBuffer、StringBuilder简述及区别

容我喝杯82年的Java压压惊~~~如有欢迎指正。 1.String:由多个字符组成的一串数据,相当与字符数组。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。字符串是常量,...
  • MAGIC_JSS
  • MAGIC_JSS
  • 2016-05-10 23:35
  • 1377

String,StringBuffer,StringBuilder效率与内存占用比较

分别使用String,StringBuffer,StringBuilder进行10000次的字符串拼接操作,计算运行时间以及java程序运行时的内存占用。public class StringWasteMemoryTest { public static void main(String[]...
  • liuweiballack
  • liuweiballack
  • 2015-11-22 21:07
  • 2672

面试题之:String,StringBuffer与StringBuilder的区别?

String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全)  简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型...
  • u014381710
  • u014381710
  • 2015-08-24 23:23
  • 431

String、StringBuffer与StringBuilder之间区别-----(java复习)

1.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String  2.String 的原因     String:字符串常量     StringBuffer:字符串变量     Strin...
  • qq_27093465
  • qq_27093465
  • 2016-03-23 14:45
  • 1389
    个人资料
    • 访问:1629046次
    • 积分:21166
    • 等级:
    • 排名:第438名
    • 原创:566篇
    • 转载:13篇
    • 译文:2篇
    • 评论:326条
    关于我
    邮箱: zhangphil@live.com
    博客专栏