Java 提供了 String,StringBuffer 和 StringBuilder 类来封装字符串, 并提供了一系列操作字符串对象的方法.
它们的相同点是都用来封装字符串; 都实现了 CharSequence 接口. 它们之间的区别如下:
一, 可变与不可变
String 类是一个不可变类, 即创建 String 对象后, 该对象中的字符串是不可改变的, 直到这个对象被销毁. StringBuffer 与 StringBuilder 都继承自 AbstractStringBuilder 类, 在 AbstractStringBuilder 中也是使用字符数组保存字符串, 是可变类.
由于 String 是可变类, 适合在需要被共享的场合中使用, 当一个字符串经常被修改时, 最好使用 StringBuffer 实现. 如果用 String 保存一个经常被修改的字符串, 该字符串每次修改时都会创建新的无用的对象, 这些无用的对象会被垃圾回收器回收, 会影响程序的性能, 不建议这么做.
二, 初始化方式
当创建 String 对象时, 可以利用构造方法 String str = new String("Java") 的方式来对其进行初始化, 也可以直接用赋值的方式 String s = "Java" 来初始化. 而 StringBuffer 只能使用构造方法 StringBuffer sb = new StringBuffer("hello") 的方式初始化.
三, 字符串修改方式
String 字符串修改方法是首先创建一个 StringBuffer, 其次调用 StringBuffer 的 append 方法, 最后调用 StringBuffer 的 toString() 方法把结果返回, 示例代码如下:
- String str = "hello";
- str += "java";
以上代码等价于下面的代码:
- StringBuffer sb = new StringBuffer(str);
- sb.append("java");
- str = sb.toString();
上述 String 字符串的修改过程要比 StringBuffer 多一些额外操作, 会增加一些临时的对象, 从而导致程序的执行效率降低. StringBuffer 和 StringBuilder 在修改字符串方面比 String 的性能要高.
四, 是否实现了 equals 和 hashCode 方法
String 实现了 equals() 方法和 hashCode() 方法, new String("java").equals(new String("java")) 的结果为 true;
而 StringBuffer 没有实现 equals() 方法和 hashCode() 方法, 因此, new StringBuffer("java").equals(new StringBuffer("java")) 的结果为 false, 将 StringBuffer 对象存储进 Java 集合类中会出现问题.
五, 是否线程安全
StringBuffer 与 StringBuilder 都提供了一系列插入, 追加, 改变字符串里的字符序列的方法, 它们的用法基本相同, 只是 StringBuilder 是线程不安全的, StringBuffer 是线程安全的,. 如果只是在单线程中使用字符串缓冲区, 则 StringBuilder 的效率会高些, 但是当多线程访问时, 最好使用 StringBuffer.
综上, 在执行效率方面, StringBuilder 最高, StringBuffer 次之, String 最低, 对于这种情况, 一般而言, 如果要操作的数量比较小, 应优先使用 String 类; 如果是在单线程下操作大量数据, 应优先使用 StringBuilder 类; 如果是在多线程下操作大量数据, 应优先使用 StringBuilder 类.
来源: https://www.cnblogs.com/bingyimeiling/p/10461100.html