看 AbstractStringBuilder 类的定义: abstract class AbstractStringBuilder...{char[] value;}
PS:StringBuffer 类和 StringBuilder 类都继承自 AbstractStringBuilder 类
我们不难发现: 在 String 类中有一个 char 类型的数组变量 value, 用 final 修饰说明大小不可变, 用来存放 String 类型数据, 实际字符串底层就是用字符数组来存储的; 而在 AbstractStringBuilder 类中也有一个 char 类型的数组变量 value, 但是没有任何修饰, 表示大小可变.
直接上代码:
- package com.bjwyj.method;
- /**
- * 测试 String,StringBuffer,StringBuilder 的区别和联系
- * @author 吴永吉
- *
- */
- public class TestString {
- public static void main(String[] args) {
- testString();
- testStringBuffer();
- testStringBuilder();
- }
- /**
- * 测试 String 对象的追加
- */
- public static void testString() {
- String str = "";
- long startTime = System.currentTimeMillis();
- for(int i=0;i<10000;i++) {
- str += i;
- }
- long endTime = System.currentTimeMillis();
- System.out.println(endTime-startTime);
- }
- /**
- * 测试 StringBuffer 对象的追加
- */
- public static void testStringBuffer() {
- StringBuffer sbuf = new StringBuffer();
- long startTime = System.currentTimeMillis();
- for(int i=0;i<10000;i++) {
- sbuf.append(i);
- }
- long endTime = System.currentTimeMillis();
- System.out.println(endTime-startTime);
- }
- /**
- * 测试 StringBuilder 对象的追加
- */
- public static void testStringBuilder() {
- StringBuilder sbud = new StringBuilder();
- long startTime = System.currentTimeMillis();
- for(int i=0;i<10000;i++) {
- sbud.append(i);
- }
- long endTime = System.currentTimeMillis();
- System.out.println(endTime-startTime);
- }
- }
测试结果:
422 15 0
从测试结果可以看出: 同样是循环 10000 次的追加操作, 结果却大不相同. String 类每次追加字符串都会创建新的对象, 消耗的时间最长, 性能极差. 而 StringBuffer 和 StringBuilder 每次追加字符串都是同一个对象, 消耗的时间极短, 性能良好. 而 StringBuffer 比 StringBuilder 消耗的时间稍长一点点, 原因是 StringBuffer 是线程安全的, 而 StringBuilder 是线程不安全的, 所以 StringBuffer 相比 StringBuilder 性能稍差一点点.
总结:
(1)String 类是不可变类, 即一旦一个 String 对象被创建后, 包含在这个对象中的字符序列是不可改变的, 直至这个对象销毁.
(2)StringBuffer 类则代表一个字符序列可变的字符串, 可以通过 append,insert,reverse,setCharAt,setLength 等方法改变其内容. 一旦生成了最终的字符串, 调用 toString 方法将其转变为 String.
(3)JDK1.5 新增了一个 StringBuilder 类, 与 StringBuffer 相似, 构造方法和方法基本相同. 不同是 StringBuffer 是线程安全的, 而 StringBuilder 是线程不安全的, 所以性能略高. 通常情况下, 创建一个内容可变的字符串, 应该优先考虑使用 StringBuilder.
来源: https://www.cnblogs.com/wuyongji/p/10555941.html