String 继承于CharSequence,也就是说String也是CharSequence类型。StringBuffer和StringBuilder也实现了CharSequence接口。(CharSequence就是字符序列,String, StringBuilder和StringBuffer本质上都是通过字符数组实现的!)
String str = new String(“jack”) 该语句会创建两个对象,首先会先检查字符串常量池中存不存在jack这个字符串对象,如果不存在就会创建,如果存在就返回内存地址值。创建了出来之后,new String这个语句就会在堆内存中开辟一个字符串对象。总共两个对象。
1.CharSequence源码(基于jdk1.7)
package java.lang;
public interface CharSequence {
int length();
char charAt(int index);
CharSequence subSequence(int start, int end);
public String toString();
}
2.StringBuilder和StringBuffer的异同
StringBuilder和StringBuffer都是可变的字符序列。它们都继承于AbstractStringBuilder,实现了CharSequence接口。默认缓冲区的容量是16。
StringBuffer所有的缓冲区操作方法都是同步的,线程安全但效率很低。StringBuilder 是JDK1.5之后提出的,线程不安全,但是效率要高。
3.扩容
/**
* This implements the expansion semantics of ensureCapacity with no
* size check or synchronization.
*/
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}
容量如果不够,直接扩充到变成2倍+2;当然最大长度是
2
31
-1(JVM 内存够用下)。
集合中也有类似情况,ArrayList 和LinkedList也有默认值10 ,也有扩容算法采用的是右偏移1 + 原有长度 ,也就是变为1.5倍大小 ,如果不够用的话,就直接扩充到需要的大小。