李文轩 2019-03-18
声明:这是本人学习极客时间的Java核心36讲的笔记,有侵权请联系我。
String:
- 字符串常量池
- Java为了避免在一个系统中产生大量的
String
对象 - 不用
new
方法创建时,首先检查池中是否有值相同的字符串对象。有则不需要创建,直接从池中查找到的对象引用;没有则新建字符串对象,返回对象引用,并将新创建的对象放入池中。
- Java为了避免在一个系统中产生大量的
String str1 = "123"; //直接赋值,放入字符串池
- 用
new
方法时,不检查字符串池,直接在栈或堆上创建一个新的对象,也不会把对象放入池中。
String Str2 = new String("123"); //new方法赋值,不放入字符串池
- 特性
- 不可变
-
String
对象生成后,不能再堆它进行改变。 - 当一个对象需要被多线程共享时,可以省略同步和锁等待时间
- 提升多线程性能,降低复杂度
-
- 针对常量池优化
- 用两个
String
对象拥有相同的值时,他们只引用常量池中的同一个拷贝 - 同一个字符串反复出现时,这个技术可以大幅度节省内存空间
- 用两个
- 不可变
StringBuffer/StringBuilder
- 都实现了
AbstractStringBuilder
抽象类,拥有一致的对外的调用接口 - 底层在内存中与String相同,都是一个有序的字符序列(char数组);
StringBuffer/StringBuilder
的对象值是可以改变的,并且值改变,对象引用不变 - 建造过程中,储存数组会先有默认容量;随着数据加入,创建更大数组,拷贝数据,弃用旧数组。
- 不用:
-
StringBuffer
是线程安全的- 性能相比较低
- 所有方法加上了
synchronize
关键字
-
StringBuilder
是线程不安全的- 性能相比较高
-
应用场景
- 若字符串不需要经常发生变化,优先使用
String
类;提高可读性 - 若频繁进行字符串运算
- 多线程(XML解析,HTTP参数解析与封装):
StringBuffer
- 单线程(SQL语句平装,JSON封装):
StringBuilder
- 多线程(XML解析,HTTP参数解析与封装):