String,StringBuffer与StringBuilder区别

String是一个不可变的字符序列,一旦定义好,则无法再修改其内容,所谓修改,实际是修改了引用变量指向的字符串对象地址.在每一次做字符串拼接时实际都是在创建新的字符串对象,因此在做大量字符串拼接时会不断创建新的对象,在效率上非常差;
StringBuffer跟String都是从CharSequence接口实现,StringBuffer是一个线程安全,可变的字符序列。 字符串缓冲区就像一个String ,但可以修改。 在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。 字符串缓冲区可以安全地被多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都按照与所涉及的各个线程所执行的方法调用顺序一致的顺序发生。每次在进行字符串拼接时只是向原来序列中新增数据,并未反复创建新对象,所以在拼接效率方面远远高于String,并且StringBuffer是线程安全的实现
StringBuilder一个可变的字符序列。 此类提供与StringBuffer的API,但不保证同步。 此类设计用作简易替换为StringBuffer在正在使用由单个线程字符串缓冲区的地方(如通常是这种情况).在可能的情况下,建议使用这个类别优先于StringBuffer ,因为它在大多数实现中将更快。 StringBuilderStringBuffer共享相同的API(相同的方法),但是StringBuilder是线程不安全的实现,在多线程运行时效率比StringBuffer要高,但是对于字符串的安全性没有保障
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章