美文网首页
面试系列—String、StringBuffer和StringB

面试系列—String、StringBuffer和StringB

作者: 旺点跑者 | 来源:发表于2019-03-05 13:22 被阅读0次
  • String


String设计和实现
    1. String是Java中重要的基础类,提供了构造和编辑字符串的各种逻辑。
    1. String是典型的Immutable类,被声明为final class。
      优点:当一个对象被多线程共享,被频繁访问时,可以节省同步和锁等待的时间。从而大幅度提高系统性能。
      缺点:由于他的不可变性,字符串的拼接、裁剪都会产生新的String对象,又降低了系统的性能。
String缓存
    1. 常量池:由于String在java中使用频繁,为了避免产生大量的String对象,引入了常量池。
      运行机制如下:创建一个字符串首先会检查池中是否已经存在相同的字符串对象,如果有则不需要创建直接从池中刚查找到的对象引用;如果没有则新建字符串对象,返回对象引用,并且将新创建的对象放入池中。但是,通过new方法创建的String对象是不检查字符串池的,而是直接在堆区或栈区创建一个新的对象,也不会把对象放入池中。上述原则只适用于通过直接量给String对象引用赋值的情况。
      举个栗子1:
String str1 = "123"; //通过直接量赋值方式,放入字符串常量池
String str2 = new String(“123”);//通过new方式赋值方式,不放入字符串常量池
    1. intern():String提供了inter()方法。调用该方法时,如果常量池中包括了一个等于此String对象的字符串(由equals方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并且返回此池中对象的引用。
      intern()有那么好吗? 实际情况估计会让你大跌眼镜。一般使用 Java 6 这种历史版本,并不推荐大量使用 intern,为什么呢?魔鬼存在于细中,被缓存的字符串是存在所谓 PermGen 里的,也就是臭名昭著的“永久代”,这个空间是很有限的,也基本不会被 FullGC 之外的垃圾收集照顾到。所以,如果使用不当,OOM就会光顾。在后续版本中,这个缓存被放置在堆中。而且,默认缓存大小也在不断地扩大中,从最初的 1009,到 7u40 以后被修改为 60013。

举个栗子2

String str = new String("abc");
str.intern();  //存放到缓存常量池中
  • StringBuffer和StringBuilder


设计和实现:
  • 二者都继承了AbstractStringBuilder,StringBuffer 的线程安全是通过把各种修改数据的方法加上synchronized关键字实现的。为了实现修改字符修改的目的,StringBuffer和StringBuilder底层都是可变char数组。二者区别在于最终方法是否加了synchronized。

  • 两者对象在构造过程中,首先按照默认大小申请一个字符数组,由于会不断加入新数据,当超过默认大小后,会创建一个更大的数组,并将原先的数组内容复制过来,再丢弃旧的数组。因此,对于较大对象的扩容会涉及大量的内存复制操作,如果能够预先评估大小,可提升性能。目前的实现是,构建时初始字符串长度加 16(这意味着,如果没有构建对象时输入最初的字符串,那么初始值就是 16)。

  • 注意:StringBuffer是线程安全的,但是StringBuilder是线程不安全的。为此,StringBuffer的性能要远低于StringBuilder。

  • 应用场景


  • 在字符串内容不经常发生变化的业务场景优先使用String类。例如:常量声明、少量的字符串拼接操作等.
  • 在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在多线程环境下,建议使用StringBuffer,例如XML解析、HTTP参数解析与封装。
  • 在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在单线程环境下,建议使用StringBuilder,例如SQL语句拼装、JSON封装等。

参考:
https://blog.csdn.net/Sqirt/article/details/72765071#commentBox
https://www.cnblogs.com/dudadi/p/8025038.html
https://blog.csdn.net/uotail/article/details/71244606

相关文章

网友评论

      本文标题:面试系列—String、StringBuffer和StringB

      本文链接:https://www.haomeiwen.com/subject/hlwduqtx.html