String 源码探讨

      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 虽然经常使用,但其实不简单…… (待续。)

相关文章
相关标签/搜索