String、StringBuilder、StringBuffer
String
特点:
String类是final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法。在Java中,被final修饰的类是不允许被继承的,并且该类中的成员方法都默认为final方法。在早期的JVM实现版本中,被final修饰的方法会被转为内嵌调用以提升执行效率。而从Java SE5/6开始,就渐渐摈弃这种方式了。因此在现在的Java SE版本中,不需要考虑用final去提升方法调用效率。只有在确定不想让该方法被覆盖时,才将方法设置为final。
底层实现是通过char数组来保存字符串的。
对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象
String为何是immutable?
- String pool (String intern pool)的要求。
- cache hashcode
- Facilitating the Use of Other Objects
- Security
- Immutable objects are naturally thread-safe
String intern()
区别:
- 运行速度:StringBuilder > StringBuffer > String
不是绝对的哦,如String str = “hello”+ “world”的效率就比 StringBuilder st = new StringBuilder().append(“hello”).append(“world”)要高。
- StringBuilder是线程不安全的,而StringBuffer是线程安全的
- StringBuffer有一个 toStringCache
/**
* A cache of the last value returned by toString. Cleared
* whenever the StringBuffer is modified.
*/
private transient char[] toStringCache;
面试组织语言
String类
- 是final,意味着不能被继承。暗示着它里面的方法也是final,不能被重写。
- 是immutable,意味着值创建后不能修改。例如substring()方法等都是重新new一个字符串返回。由于不可变,可用来做共享对象。
- 底层实现是char[]数组
Java 语言提供为字符串拼接提供了特殊自支持,它是通过StringBuilder和StringBuffer的append方法来实现的。
StringBuffer和StringBuilder的异同点:
共同点:
1. 都继承自AbstractStringBuilder,它们方法都差不多。
2. 底层实现都是char[]数组
3. 都是可变的字符序列。
区别:
4. StringBuffer是线程安全的。StringBuilder线程不安全。
5. StringBuffer有一个char[] toStringCache,用以缓存toString方法结果。
6. 运行速度而言,StringBuffer > StringBuider
结论:
- String:适用于少量的字符串操作的情况
- StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
- StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
[探秘Java中的String、StringBuilder以及StringBuffer]