目录
1. String类
“String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。”
这是一个官方的解释,看到这样的解释是不是一脸懵呢。
1.1 String对象:
创建String类最简单的方式是:
String a = "ab";
同时,String是一个对象类那同样可以new一个对象来创建:
String b = new String("cd");
String 创建的字符串存储在常量池中,而 new 创建的字符串对象在堆上:
1.2 String对象是“不可变的”、“不可扩展的”。
比如我们给a再赋值:
a = "bc";
那么,会在常量池中开辟一个新的内存空间存放"bc"常量并指向它的地址,如图:
所以说String是不可变的、不可扩展的;
2. StringBuilder
StringBuilder是一个可变的字符序列,非线程安全。它比 StringBuffer 要快。 在 StringBuilder 上的主要操作是 append 和 insert 方法。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串生成器中。比如:
3. StringBuffer
StringBuffer是字符串变量,它和StringBuilder类似,它的对象也是可以扩充和修改的。但是,StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。
3.1 StringBuffer是如何实现线程安全的呢?
如图展示的是StringBuffer的部分方法源码:
其很多方法都加了 synchronized , 也就是同时刻只能有一个线程去执行一个方法。
关键的获取长度 , 增加方法以及其它方法 , 都是加了锁的 .所以是线程安全的。
但是,它的效率不高。