String、StringBuffer和StringBuilder的区别

在实际开发中,这三个类的使用,经常傻傻的分不清楚。今天特别对这三个类进行对比,个人对String三兄弟有了一个新的认识。希望也能帮到你。

先来做个比较

String

  1. Constant String Pool : 当我们新建一个String对象,他被存储在String的常量池里。
  2. Immutable Object: 在String源码中有注解,String类创建的对象是一个不可变对象。不可变类不提供set方法,来改变对象的状态。所以不可变对象一旦创建,他的状态将不能改变。如果需要修改这个对象的状态,就需要创建一个新的同类型的对象,然后将这个新的状态放入这个新对象里。此处参考String的contact源码,当我们对原有的String对象进行拼接时,其实是创建了一个新的对象,源码在下面展示。String的设计符合设计模式中的不变模式(Immutable Pattern),大家有兴趣可以了解一下。
  3. Is Thread Safe :线程安全,就因为String的对象是不变对象,所以,任何线程不能改变他的状态,所以她是线程安全的。不同的线程可以共享一个String对象。
/**
     * Concatenates this string and the specified string.
     * 此处是本文作者注释 : 字符串拼接时,并不是在原有对象的基础上进行拼接,而是将原有字符串内容和将要拼接的字符串内容进行组合放在名字为buffer的char数组里,然后重新new 一个String对象。 
     * 
     * @param string
     *            the string to concatenate
     * @return a new string which is the concatenation of this string and the
     *         specified string.
     */
    public String concat(String string) {
        if (string.count > 0 && count > 0) {
            char[] buffer = new char[count + string.count];
            System.arraycopy(value, offset, buffer, 0, count);
            System.arraycopy(string.value, string.offset, buffer, count, string.count);
            return new String(0, buffer.length, buffer);
        }
        return count == 0 ? string : this;
    }

一个对象的状态在对象创建之后就不再变化,这就是所谓的不变模式(Immutable Pattern)。

StringBuffer

  1. Heap : 新建一个StringBuffer对象,对象被存储在堆里。
  2. Mutable Object : StringBuffer对象是一个可变对象,所以可以被赋予一个新值。
  3. Is Thread Safe : StringBuffer的线程安全很好理解,没错源码中已经给出了我们答案,StringBuffer的方法都是同步的,被synchronized修饰,同一段代码“同时”只能被一个线程操作,所以她是线程安全的。
  4. Performance hits : 因为StringBuffer的方法是同步的,所以他的性能会降低。

StringBuilder

  1. Heap :同StringBuffer。
  2. Mutable Object : 同StringBuffer。
  3. Not Is Thread Safe : 不是线程安全的, 多线程访问会产生不可预期的结果。
  4. Faster than StringBuffer :因为方法没有锁限制,所以速度要比StringBuffer快。

结论

如果在多线程的情况下,考虑线程安全问题,使用String和StringBuffer。如果需要多次改变对象的值,使用StringBuffer,因为String对象是不可变对象,每次改变对象的状态都要新创建一个对象,造成资源浪费。

如果在多线程情况下,不考虑线程安全问题,是用StringBuilder,因为StringBuilder的性能高,效率快。

如果在单线程的情况下,使用StringBuffer和StringBuilder是等价的,通过判断对象是否会多次变化,来选择是用String与否,如果变化次数少,则使用,反之不使用。

关于

1、immutable和mutable对象(java) :大家可以看下面这篇博客
http://blog.csdn.net/brucexu1978/article/details/43669481

2、 Immutable Pattern :不变模式
《Java多线程设计模式》推荐这边书。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值