java stringbuilder和stringbuffer,java stringbuffer和stringbuild

  java stringbuilder和stringbuffer,java stringbuffer和stringbuild

  Java _ technical blog of _ wx 62 E0 b 69890 c 77 _ 51c to blog中String、StringBuffer、StringBuilder的区别

  在Java中,字符串属于对象,Java提供了一个string类来创建和操作字符串。

  需要注意的是,String的值是不可变的,这就导致每次操作String都会产生新的String对象,不仅效率低下,还浪费了大量有限的内存空间。

  至于为什么是不可变的,我们可以看看下图,发现String是用final修饰的,这就导致了它的不变性。

  接下来,我们从内存的角度来看一下我们操作字符串类型时内存的变化。

  不难看出,最初的字符串值是 Hello ,然后在这个字符串后添加了新的字符串 world 。这个进程又一次在堆中打开了空间,通过三次操作这两个字符串打开了内存空间。为了解决频繁的字符串相关操作,引入了StringBuilding和StringBuffer。

  StringBuilding和StringBuffer的区别其实这个问题已经在面试中问过了,为什么还要问这么简单的问题呢?

  其实这个问题一般只在开头问,因为这个问题关系到线程安全,然后怎么保证线程安全?各种锁,什么是锁,锁机制,什么是死锁等等。然后转到synchronized,它的原理,如何使用它,synchronized和volatile有什么区别,为什么使用volatile,上升到Java内存模型,然后承包出去

  与String类不同,StringBuffer和StringBuilding类的对象可以多次修改,而不会生成新的对象。

  StringBuilding类是在Java5中提出的,它和StringBuffer最大的区别在于它不是线程安全的,也就是不支持同步访问。有得必有失。StringBuilding会更快,因为它不需要相应的锁定机制(下面会提到)。一般来说,我们更喜欢使用StringBuilding,但是当应用程序要求线程安全时,您必须使用StringBuffer类型。

  字符串中的About==//1

  String s1=新字符串( Hello world );

  String s2=新字符串( Hello world );

  system . out . println(S1==S2);//假

  //2

  String s3= Hello world

  字符串s4= Hello world

  system . out . println(S3==S4);//真代码1中的局部变量s1,s2存储了JVM在堆中新生成的两个String对象的内存地址。虽然这两个String对象(char[]中存储的字符序列)的值都是‘Hello world’。所以==比较两个不同的堆地址。

  代码2中的局部变量S3和S4也存储有地址,但它们都是常量池中‘Hello world’所指向的堆中唯一滞留字符串对象的地址。自然是平等的。

  StringBuffer和StringBuilder的方法在线程安全上没有太大区别。但从线程安全性来说,StringBuffer允许多个线程执行字符操作。这是因为在源代码中,StringBuffer的很多方法都是用关键字synchronized修饰的,而StringBuilder不是。

  字符串缓冲器

  StringBuilding

  效率StringBuffer和StringBuilder是双胞胎。StringBuilder是1.5中新引入的,它的前身是StringBuffer。StringBuilder比StringBuffer稍微高效一些。如果不考虑线程安全,StringBuilder应该是首选。此外,JVM运行程序的主要时间是创建和回收对象。

  1.总结。不需要为可以在编译阶段确定的字符串常量创建String或StringBuffer对象。使用直接字符串常量的“”连接操作效率最高。

  2.追加效率为2。StringBuffer对象高于String对象的“”联接操作。

  3.不断创建对象是程序效率低下的重要原因。那么同一个字符串值在堆中只能创建一个字符串对象吗?显然,滞留字符串可以做到这一点,只是程序中的字符串常量会由JVM自动创建,对String的intern()方法的调用也可以。调用intern()时,如果常量池中已经存在当前字符串的值,则返回该常量指向的滞留对象的地址。如果没有,将字符串值添加到常量池,并创建一个新的滞留字符串对象。

  版权归作者所有:原创作品来自博主、程序员,转载授权请联系作者,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: