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。所以创建一个对象。完成多次更改。当然超过指定长度的时候也会开辟一个新个内存空间。
- String 、StringBuffer 和 StringBuilder
- String,StringBuffer,StringBuilder(转载)
- String、StringBuffer和StringBuilder
- String,StringBuffer,StringBuilder
- String、StringBuffer和StringBuilder
- String、StringBuffer和StringBuilder
- String StringBuffer StringBuilder
- String StringBuffer StringBuilder
- String StringBuffer StringBuilder
- String StringBuffer StringBuilder
- String ,StringBuffer ,StringBuilder问题
- String StringBuffer StringBuilder
- String StringBuffer StringBuilder 区别
- StringBuilder StringBuffer String
- StringBuilder。StringBuffer。String
- String,StringBuffer与StringBuilder
- String、StringBuffer和StringBuilder
- String, StringBuffer, StringBuilder区别
- Android第三方库学习清单
- 02-百思不得姐(第二天)
- java笔记-11
- 概率分析
- 笔试题总结-第一次面试
- String ,Stringbuffer ,StringBuilder;
- 用JAVA进行图像识别的小程序
- 面试1-HTTP状态码
- At91sam9g35K烧录Linux系统
- Qml文件的两种加载方式|启动Qt quick app的两种方法
- Yii createCommand CURD操作+个人总结
- 学习python2.7的迭代器
- UIPickerView
- 设计模式_观察者模式