String stringBuffer StringBuilder 的区别

原文链接:String stringBuffer StringBuilder 的区别
关于string、 stringBuffer、 StringBuiller、的区别在网上的文章已经很多。
在这做以整理、记录。

1、String str1=“demo” 和 String str2=new String(“demo”) 的区别?

答:1)存储位置不同,String 存储在常量池,new是在堆中开辟空间。
String str="demo"可能创建1个或不创建对象(先去常量池找是否存在,存在不创建,不存在创建)
String str=new String(“practic”) 至少一个(必创tr2对象,"demo"同上一样)
2、string、在开发中的注意事项:

答:1)string a=“hello”,这种操作,在常量池有可能创建一个对象,并且不可更改。
并且:a=a+“word”、同上、最后创建hello word,只是a的引用对象变了,三个常量文本还在。
如果在 foreach循环中大量使用,会创建对各副文本对象,降低效率。
3、stringBuffer、 StringBuilder的区别?

答:1)这两个,解决了String不可更改,以及造成大量副文本的问题。

2)创建的时候,new 在堆中开辟空间。

3)他们区别是线程安全问题,StringBuffer,实现了synchronized方法,所以比StringBuilde慢。为安全线程,而StringBuilde为非安全线程

StringBuilder>StringBuffer>String

以下为append方法源码:

/**
 * StringBuffer更好的解决了,以上问题
 * 线程安全,速度慢
 */
private void testStringBuffer() {
    //只创建了一个对象
    StringBuffer stringBuffer = new StringBuffer();
    //但是此线程是安全的
    stringBuffer.append("hello");
    stringBuffer.append("word");
    /**
     * append源码:
     *  public synchronized StringBuffer append(String str) {
     *         toStringCache = null;
     *         super.append(str);
     *         return this;
     *     }
     */
    //线程安全原因:对单次操作进行了synchronized加锁操作
    //所以线程为安全线程,但是速度慢,多用于多线程
}

/**
 * StringBuilder同理解决问题,
 * 线程不安全,速度快
 */
private void testStringBuilder() {
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append("hello");
    stringBuilder.append("word");
    /**
     * append源码:
     *   public StringBuilder append(String str) {
     *         super.append(str);
     *         return this;
     *     }
     */
    //线程安全问题:未对线程进行加锁,所以只能用于单线程
}

面向开发过程,记录学习之路。
有些问题,如果不理解,就背下来,走着走着有一天你会发现,原来如此美妙。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值