String ,Stringbuffer ,StringBuilder;
2016-03-11 22:46
399 查看
突然看到StringBuffer有些忘记故写下来以便复习与更加理解。
String 首先不多解释 ,在下面解释;
StringBuffer是线程安全的,可以适用于多线程更改字符串内容。效率比StringBuilder低需要维护锁;
StringBuilder是线程不安全的,但是效率高,常用语单线程修改字符串内容;
首先说明StringBuffer与StringBuilder的区别;我们看源码:
StringBuffer的源码
的
看StringBuilder源码
同样随便复制,都没有加同步方法锁。
总结:但是这两个类都是 AbstractStringBuilder的子类且算法基本相同。所以使用其中之一取决于你当前是否为多线程处理,
最后取到StringBuffer与StringBuilder的其一,我们与String就做比较;
(1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,需要重复创建销毁对象。
但是StringBuffer类对象为可修改对象,可以通过append()方法来修改值
做个实例
:最后打印的值为
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低需要维护锁;
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。所以创建一个对象。完成多次更改。当然超过指定长度的时候也会开辟一个新个内存空间。
相关文章推荐
- Android子线程中更新UI的3种方法
- iOS开发--UIPickerView(选择器控件) 省份和城市的做法
- UINavigationController导航控制器
- 最新OSSIM改装平台DEMO WebUI
- bind 的第三方性能测试工具 queryperf
- UITableView和UICollectionView列表出现重叠问题
- iOS--UIAlertView与UIAlertController和UIAlertAction之间的事儿
- UIPickerView
- iOS UIPickerView 显示全国省市
- UESTC 250 windy数
- iOS 开源项目介绍之UI篇
- 滚动视图UIScrollView
- UI--UIControl控制器
- UIPickerView简单应用
- UIScrollView的简单使用
- Sublim 3中设置新的builid system
- 关于UIButton的一些用法
- leetcode 63. Unique Paths II | Java最短代码实现
- 2015 UESTC Training for Data Structures 秋实大哥下棋
- LeetCode-187. Repeated DNA Sequences