Java 中操做字符串都有哪些类?它们之间有什么区别

1. String、StringBuffer、StringBuilder

原文出自《编写高质量代码:改善 Java 程序的 151 个建议》web

CharSequence 接口有三个实现类与字符串有关:String、StringBuffer、StringBuilder,虽然它们都与字符串有关,可是其处理机制是不一样的。数组

String 类是不可改变的量,也就是建立后就不能再修改了,好比建立了一个“abc”这样的字符串对象,那么它在内存中永远都会是“abc”这样具备固定表面值的一个对象,不能被修改,即便想经过 String 提供的方法来尝试修改,也是要么建立一个新的字符串对象,要么返回本身,好比:安全

String str = "abc";
String str1 = str.substring(1);

StringBuffer 是一个可变字符序列,它与 String 同样,在内存中保存的都是一个有序的字符序列(char 类型的数组),不一样点是 StringBuffer 对象的值是可改变的,例如:微信

StringBuffer sb = new StringBuffer("a");
sb.append("b");

从上面的代码能够看出 sb 的值在改变,初始化的时候是“a”,通过 append 方法后,其值变成了“ab”。可能有读者会问了,这与 String 类经过“+”链接有什么区别?例如:多线程

String s = "a";
s = s + "b";

有区别,字符串变量 s 初始化时是“a”对象的引用,通过加号计算后,s 变量就修改成了“ab”的引用,可是初始化的“a”对象仍是没有改变,只是变量 s 指向了新的引用地址。再看看 StringBuffer 的对象,它的引用地址虽不变,但值在改变。app

StringBuilder 与 StringBuffer 基本相同,都是可变字符序列,不一样点是:StringBuffer 是线程安全的,StringBuilder 是线程不安全的,翻翻二者的源代码,就会发如今 StringBuffer 的方法前都有 synchronized 关键字,这也是 StringBuffer 在性能上远低于 StringBuilder 的缘由。编辑器

在性能方面,因为 String 类的操做都是产生新的 String 对象,而 StringBuilder 和 StringBuffer 只是一个字符数组的再扩容而已,因此 String 类的操做要远慢于 StringBuffer 和 StringBuilder。post

弄清楚了三者的原理,咱们就能够在不一样的场景下使用不一样的字符序列了:性能

(1)使用 String 类的场景ui

在字符串不常常变化的场景中能够使用 String 类,例如常量的声明、少许的变量运算等。

(2)使用 StringBuffer 类的场景

在频繁进行字符串的运算(如拼接、替换、删除等),而且运行在多线程的环境中,则能够考虑使用 StringBuffer,例如 XML 解析、HTTP 参数解析和封装等。

(3)使用 StringBuilder 类的场景

在频繁进行字符串的运算(如拼接、替换、删除等),而且运行在单线程的环境中,则能够考虑使用 StringBuilder,如 SQL 语句的拼装、JSON 封装等。

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

原文地址:https://juejin.im/post/5a5d5c66f265da3e261bf46c

做者:wangchun_166

一、String 是字符串常量,而 StringBuffer 和 StringBuilder 是字符串变量。由 String 建立的字符内容是不可改变的,而由 StringBuffer 和 StringBuidler 建立的字符内容是能够改变的。

二、StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的。StringBuilder 是从 JDK 5 开始,为 StringBuffer 类补充的一个单线程的等价类。咱们在使用时应优先考虑使用 StringBuilder,由于它支持 StringBuffer 的全部操做,可是由于它不执行同步,不会有线程安全带来额外的系统消耗,因此速度更快。

- END -


本文分享自微信公众号 - 骇客与画家(hacker-and-painter)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索