zoukankan      html  css  js  c++  java
  • 面试刷题5:String StringBuffer StringBuilder区别?

    image.png

    字符串是应用中最广泛的存在,不容忽视。

    我是李福春,我在准备面试,今天我们一起来回答问题。

    String,StringBuffer,StringBuilder的区别是什么?

    非常常见的面试题,一起来发散一下。

    String

    Java中最重要的类,提供了各种构造和管理字符串的操作;
    它是Immutable类,即不可变,原生的保证了线程安全;
    她的构造和各种操作都会产生一个新的String对象;所以要考虑内存和垃圾回收问题;

    StringBuffer

    线程安全的,为了解决String的操作产生很多中间String对象的问题。继承自AbstractStringBudiler,同步方法是在对应的操作方法中简单粗暴的加上syncronized关键字。

    虽然不产生新的中间String对象,但是内部有一个数组负责存储,提前设置合理大小可以避免数组扩容引起的性能损耗。

    StringBuilder

    同StringBuffer,不过是线程非安全的。

    java8底层已经把字符串的+操作自动转换为StringBuilder的拼接操作;

    字符串缓存

    把jvm的堆转储,(dump heap)发现半数是重复的,如果可以避免重复的字符串,可以有效降低内存消耗和对象创建开销。

    可以通过jvm的参数设置缓存池的大小 -XX:StringTableSize=x

    intern是一种显示的排重机制,但是不推荐使用;

    最新的jdk8,使用G1 GC,指定字符串排重参数可以达到底层去重的效果:

    -XX:+UseStringDedumplication

    其它字符串的底层优化

    比如使用本地内联方法的intrinsic机制来优化字符串的操作速度;

    改变StringBuilder的存储的数据结构为Compact Strings提高存储效率;

    小结

    本篇简单的回答了String,StringBuffer,StringBuilder的区别。
    然后分析了StringBuffer,StringBuilder底层代码,提出来提前设置大小的优化建议;

    字符串缓存是提高存储效率的中重要途径,最好使用jvm的参数进行调优。

    image.png

    原创不易,转载请注明出处。

  • 相关阅读:
    HD1205吃糖果(鸽巢、抽屉原理)
    POJ3628 Bookshelf 2(01背包+dfs)
    poj1631Bridging signals(最长单调递增子序列 nlgn)
    【转】KMP算法
    Intern Day1
    记 MINIEYE C++应用开发实习生技术一面
    解决Mac下CLion无法编译运行多个cpp的问题
    记赛目科技C++开发工程师实习生技术面
    Git总结
    Docker学习大纲
  • 原文地址:https://www.cnblogs.com/snidget/p/12560071.html
Copyright © 2011-2022 走看看