String
源码分析:
1 | public String() { |
String类中每一个看起来会修改String值得方法,实际上都是创建了一个全新的String对象。每当把String对象作为方法的参数时,都会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置上。这就是为什么我们说String类是不可变的(immutable)。
StringBuffer
源码分析:
定义:
1 | public final class StringBuffer |
StringBuffer类被final修饰,因此不能继承。
此类的父类是AbstractStringBuilder,AbstractStringBuilder类中具体实现了可变字符序列的一系列操作,比如append()、insert()、delete()、replace()、charAt()方法等。
此类实现了两个接口,Serializable表示该类的对象可以被序列化,CharSequence的接口提供了几个对字符序列进行只读访问的方法,例如length()、charAt()、subSequence()、toString()方法等。
主要变量:
1 | /** |
- toStringCache用来缓存toString()方法返回的最近一次的value数组中的字符。当修改StringBuffer对象时会被清除。
value用来存储字符序列中的字符。这是一个动态数组,当存储容量不足时,会对它进行扩容。
1
2
3AbstractStringBuilder(int capacity) {
value = new char[capacity];
}count表示value数组中已存储的字符数。
StringBuffer类将所有操作字符序列的方法都添加了 synchronized 关键字来修饰,因此,StringBuffer类是线程安全的。
StringBuilder
StringBuilder和StringBuffer的源码中,定义和操作几乎都是一样的,唯一的区别是StringBuffer是线程安全的,在单线程的情况下StringBuilder比StringBuffer要快。