前言:做文件操作的时候又用到了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。