String 是java开发中最经常使用的类之一了。今天去看下jdk对String的实现。java
首先来看下String类被final修饰符修饰的,也就是说String类是一个最终类,它不能被继承。而后在看看String实现了那些接口呢: Serializable, Comparable<String>, CharSequence,分别是序列化、比较以及字符序列。数组
接着往下看,发现其实String的根本就是一个char数组的封装。并且这个数组被final修饰,也就是说当调用substring(int beginIndex)等方法会改变字符串的长度时,实际上是生成了一个新的String 字符串。在往下看是一个ObjectStreamField数组,ObjectStreamField是什么类,干嘛用的呢?安全
A description of a Serializable field from a Serializable class. An array
of ObjectStreamFields is used to declare the Serializable fields of a class.this
序列化类的可序列化字段的描述。一个ObjectStreamField数组用来声明序列化类的序列化字段集合。线程
翻译不过关,请见谅,也就是说 String类声明不序列话任何字段。String在《Object Serialization Stream Protocol》有特殊处理。嗯,大概是这样。若是理解错误,请你们指出。翻译
在往下就是String的构造方法了。以下是其中的一个:继承
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}接口
String实例的value字段保存的是一个传入值的复制。为的是防止后续对传入值的修改影响到String,若是不是存储备份,其实至关与暴露了String的内部字段——value。另外的一个值得注意的构造方法是:ip
public String(StringBuffer buffer) {
synchronized(buffer) {
this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
}
}开发
对StringBuffer有同步锁,而其余的构造方法是没有同步锁的。这应该是履行StringBuffer线程安全的承诺吧。
另一个是toLowerCase,toUpperCase这两个方法和想象中的有所不一样,光方法的长度,这两个方法应该是String里较长的方法之二了。实事上很复杂…… 。valueOf(...)类方法基本上是对Integer.toString(i)等的封装。
另外:intern() 是native 方法。
String 虽然经常使用,但其实不简单…… (待续。)