String、StringBuffer以及StringBuilder的区别?

都是java.lang包下

String 

 implements java.io.Serializable, Comparable<String>, CharSequence    占用资源多

1. 值(长度和内容)不变(常量)  private final char value[];     但引用可变        利用反射可以修改常量池中的常量(value数组)

2. 构造方法:无参、字符串常量、字符数组、字符数组的一部分、整数数组的一部分、字节数组、字节数组的一部分、StringBuffer对象、StringBuilder对象等

3. 功能:判断、获取、转换、替换、去空格、按字典序比较      NOTE:基本上返回的是新串

StringBuffer

extends AbstractStringBuilder implements java.io.Serializable, CharSequence   占用资源少

1. 值(长度和内容)可变    private transient char[] toStringCache;//不被序列化     

2. 构造方法:无参(初始大小为16),带参(指定大小),字符串(大小为字符串长度+16)

3. 功能:添加(任意类型),删除(也可指定位置),替换,反转,NOTE:原StringBuffer串上做调整修改   

               截取(返回的是新字符串)

4. 同步,线程安全,效率低

    为什么StringBuffer线程安全?因为其所有的public方法都是synchronized修饰的!

5. 缓冲区

   private transient char[] toStringCache;
   
   @Override
   public synchronized String toString() {
        if (toStringCache == null) {
            toStringCache = Arrays.copyOfRange(value, 0, count);
        }
        return new String(toStringCache, true);
    }
    String(char[] value, boolean share) {
        // assert share : "unshared not supported";
        this.value = value;
    }

缓冲区对StringBuffer的优化:直接使用toStringCache构造一个新的字符串

6. 适用场景:多线程

StringBuilder

extends AbstractStringBuilder implements java.io.Serializable, CharSequence   占用资源少

1. 值(长度和内容)可变    没有缓冲字符数组!!!

2. 构造方法:无参(初始大小为16),带参(指定大小),字符串(大小为字符串长度+16)

3. 功能:添加(任意类型),删除(也可指定位置),替换,反转,NOTE:原StringBuffer串上做调整修改   

              没有截取!!!

4. 非同步,线程不安全,效率高

    为什么StringBuffer线程不安全?因为其方法没有加同步锁!

5. 缓冲区

    @Override
    public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);
    }
 public String(char value[], int offset, int count) {
        if (offset < 0) {
            throw new StringIndexOutOfBoundsException(offset);
        }
        if (count <= 0) {
            if (count < 0) {
                throw new StringIndexOutOfBoundsException(count);
            }
            if (offset <= value.length) {
                this.value = "".value;
                return;
            }
        }
        // Note: offset or count might be near -1>>>1.
        if (offset > value.length - count) {
            throw new StringIndexOutOfBoundsException(offset + count);
        }
        this.value = Arrays.copyOfRange(value, offset, offset+count);
    }
    public static char[] copyOfRange(char[] original, int from, int to) {
        int newLength = to - from;
        if (newLength < 0)
            throw new IllegalArgumentException(from + " > " + to);
        char[] copy = new char[newLength];
        System.arraycopy(original, from, copy, 0,
                         Math.min(original.length - from, newLength));
        return copy;
    }

复制一个字符数组构建一个字符串

6.  适用场景:单线程 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值