Java中的String、StringBuilder、StringBuffer三者的区别

匿名 (未验证) 提交于 2019-12-02 21:53:52

Java中的String、StringBuilder、StringBuffer三者的区别

在刚开始学习的时候,对于性能啥的完全不了,一般字符串操作都是String直接加加减减,觉得能完成功能完成就好了。然后考虑到找工作了,看了点面经发现有可能会问到一些相关的问题,了解了一些。后面看了点关于虚拟机的知识,慢慢对String类型如何实现和底层是怎么样的产生了兴趣。找个机会总结一下 这篇文章的内容基本参考自网络,添加了一些自己的想法。 首先,这三者必定是Java处理String的类。那么区别是什么呢? 先简单来说,处理的效率上:StringBuilder > StringBuffer > String 线程安全来说,StringBuilder处理数据是非线程安全的,而StringBuffer是线程安全的。这点主要是从源码的角度来说的。他们两者的区别类似于HashMap和HashTable。在StringBuffer中的方法基本都是有Synchronized 关键字标记,适合在多线程环境中使用,当然因为这样,所以处理效率上比不上StringBuilder。

1、String类

展开一下String类,String类在Java中是不可变类,不可变指的是任何对String类型的改变都基本上是创建一个新的String对象,然后将这个新的对象的引用传递回来,这个步骤由JVM实现。每次对String类型的值进行修改,都会在常量池中进行查找,查看是否已经有这样的一个String了,如果有,那个就把这个String的引用返回给当前的String,没有的话,就会新建一个String对象,如果需要频繁对String进行修改,最好不要用String。因为会产生大量无用的String对象,导致JVM需要经常GC删除无用的对象。 这样做的好处就是节省常量所占的空间。相同的字符串不用重复创建。(本想扩展开讲,发现自己水平还是不足,等以后来补充吧)

一些具体的内容还可以查看String中intern()方法。Java技术――你真的了解String类的intern()方法吗

2、StringBuffer类

 public final class StringBuffer  

查看源码,可以看到它是继承了抽象方法AbstractStringBuilder,可以看出这两个其实底层方法实现基本都是一致,其中的大多数方法都是直接使用父类的方法体,不同的是StringBuffer类在自己的方法前添加synchronized关键字,然后里面调用的是父类的具体实现。如下:

    //这是在StringBuffer类,可以看出主要是调用super.append();方法      
    /**       //在父类找到对应的append()方法      public AbstractStringBuilder append(String str) {                                   

其中使用的频繁的就是这个append 方法,主要源码就是上面。可以看出底层的实现用的是一个char数组,存储字符,然后当有字符添加,就需要对数组进行重新扩充。在底层重新new一个char数组返回。之前的数组应该没有引用就会被GC回收掉。

3、StringBuilder类

public final class StringBuilder  

其中具体的内容和StringBuffer类差不多,其中继承的类都是一样的。就是在方法前面少了synchronized 关键字,所以他的速度相对快一些。底层相同,不用考虑多线程,当然效率高。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!