原文链接: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;
* }
*/
//线程安全问题:未对线程进行加锁,所以只能用于单线程
}
面向开发过程,记录学习之路。
有些问题,如果不理解,就背下来,走着走着有一天你会发现,原来如此美妙。