String ,Stringbuffer ,StringBuilder;

来源:互联网 发布:东莞淘宝美工兼职 编辑:程序博客网 时间:2024/05/17 04:43

突然看到StringBuffer有些忘记故写下来以便复习与更加理解。

String 首先不多解释 ,在下面解释;

StringBuffer是线程安全的,可以适用于多线程更改字符串内容。效率比StringBuilder低需要维护锁;

StringBuilder是线程不安全的,但是效率高,常用语单线程修改字符串内容;

首先说明StringBuffer与StringBuilder的区别;我们看源码:

StringBuffer的源码

public synchronized void setCharAt(int index, char ch) {if ((index < 0) || (index >= count))    throw new StringIndexOutOfBoundsException(index);value[index] = ch;    }    /**     * @see     java.lang.String#valueOf(java.lang.Object)     * @see     #append(java.lang.String)     */    public synchronized StringBuffer append(Object obj) {super.append(String.valueOf(obj));        return this;    }    public synchronized StringBuffer append(String str) {super.append(str);        return this;
随便复制了内部源码观看基本上每个方法都加了同步synchronized判断。所以相对效率就低了。但是线程安全了。


StringBuilder源码

public StringBuilder append(String str) {super.append(str);        return this;    }    // Appends the specified string builder to this sequence.    private StringBuilder append(StringBuilder sb) {if (sb == null)            return append("null");int len = sb.length();int newcount = count + len;if (newcount > value.length)    expandCapacity(newcount);sb.getChars(0, len, value, count);count = newcount;        return this;    }

同样随便复制,都没有加同步方法锁。

总结:但是这两个类都是 AbstractStringBuilder的子类且算法基本相同。所以使用其中之一取决于你当前是否为多线程处理,


最后取到StringBuffer与StringBuilder的其一,我们与String就做比较;

(1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,需要重复创建销毁对象。

       但是StringBuffer类对象为可修改对象,可以通过append()方法来修改值

做个实例

String str1="abc";String str2="efg";String str3 =str1+str2;System.out.println("str3地址:"+str3.hashCode());//HashCode是判断识别是否为一个对象值不相等说明不是一个对象。str3 =str1+str3+str2;System.out.println("str3地址:"+str3.hashCode());StringBuffer strB1=new StringBuffer("abc");StringBuffer strB2=new StringBuffer("efg");StringBuffer strB3=strB1.append(strB2);System.out.println("strB3地址:"+strB3.hashCode());strB3=strB3.append(strB3);System.out.println("strB3地址:"+strB3.hashCode());

:最后打印的值为

str3地址:-1424384956
str3地址:2073307904
strB3地址:1743911840
strB3地址:1743911840

修改str3的值等于是又创建了一个新的对象。Hashcode值更改。

而StrB3更改不会去创建新的对象

所以去修改String类对象的性能远不如StringBuffer类。所以这也是StringBuffer类编写的意义为了解决String这一弊端。

再看源码:String是final 的不可更改的,每次改动都是要创建新的对象。StringBuffer虽然是String 类型。但是初始化的 时候调用的是默认16个长度的char类型。最后才调用tostring。所以创建一个对象。完成多次更改。当然超过指定长度的时候也会开辟一个新个内存空间。



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 两周宝宝不说话怎么办 两岁宝宝说话有点口吃怎么办 一周岁的宝宝脾气不好怎么办 九个月的宝宝脾气不好怎么办 两岁宝宝脾气不好怎么办 2岁宝宝脾气不好怎么办 3岁宝宝脾气不好怎么办 脾气不好吓到宝宝了怎么办 四个月宝宝脾气不好怎么办 5岁说话不清楚该怎么办 小孩快上幼儿园了不怎么说话怎么办 四岁宝宝吐字不清楚怎么办 孕28周胎儿腿短怎么办 b超显示腿短怎么办 2岁多宝宝不愿意说话怎么办 6岁儿童咬字不清怎么办 两岁宝宝爱看电视怎么办 两岁宝宝喜欢看电视怎么办 三岁宝宝说话不清晰怎么办 儿子快四岁了说话不清楚怎么办 儿子快三岁了说话不清楚怎么办 2岁宝宝受刺激了怎么办 一岁的宝宝口臭怎么办 古话说小孩牙齿掉了怎么办 宝宝三岁胆子小怎么办 小宝宝就是不愿意学说话怎么办 2岁宝宝体重偏重怎么办 三岁宝宝体重偏重怎么办 3岁宝宝说话晚怎么办 孩子吃饭总说话吃饭慢怎么办 我的孩子不聪明怎么办 小孩个子长不高怎么办 晚修自己老喜欢讲话怎么办 宝2岁宝脾气大怎么办 宝宝比同龄孩子发育晚怎么办 早教机构业绩不好怎么办 孩子上早教课哭怎么办 两岁宝宝哭闹不止怎么办 7个月宝宝怕生疏怎么办 5个月宝宝怕洗澡怎么办 4个月宝宝认人怎么办