前言:做文件操作的時候又用到了String,因爲之前看過String的一點東西,一直擔心會不會內存溢出啥的,所以找了篇帖子來系統學一下。
參考:
https://blog.csdn.net/weixin_43904316/article/details/89058575
https://www.cnblogs.com/chengshan/p/12272443.html
https://baijiahao.baidu.com/s?id=1650332944024875156&wfr=spider&for=pc
目錄
第二章 StringBuilder與StringBuffer
第一章 String字符串
String是字符串常量,常量是不可以被修改的,所以String對象一旦被創建是不能改變的,但是下面的代碼明明改變了,其實這只是一種假象。jvm實際上是這樣解析的:先在字符串常量池創建一個對象str賦值asd,然後在創建個對象賦值asdas第一個str就會垃圾回收機制回收,所以String對象一旦被創建是不能改變,java String對象實際上是一個不斷被創建然後被回收的過程。所以其執行速度是最慢的,但是不可變也註定其線程是安全的。
package demo3;
public class StringDemo {
public static void main(String[] args) {
String str = "asd";
System.out.println(str);
str = str+"as";
System.out.println(str);
}
}
相同的字符串,其引用指向的地址是一樣的,除非字符串使用new建立的
字符串創建方法:
可以看到直接寫的字符串地址相同,用new創建的字符串地址不同
第二章 StringBuilder與StringBuffer
爲了避免進行一次字符串操作都要創建一個新字符串然後銷燬舊字符串的行爲,可變字符串StringBuilder和StringBuffer出現了,StringBuilder是線程不安全的,但是效率高,StringBuffer是線程安全的,但是效率低。
可以看得出StringBuffer多出了synchronized
@Override
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
super.append(String.valueOf(obj));
return this;
}
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
@Override
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
經過測試,StringBuilder也確實更快
第三章 總結
如果要操作少量的數據用 String;
多線程操作字符串緩衝區下操作大量數據 StringBuffer;
單線程操作字符串緩衝區下操作大量數據 StringBuilder。