天天看点

源码分析篇之String源码分析一

   一直以来都听到很多周围的同事说看源码,看源码,自己也在不知不觉中收到影响,加入了看源码的行列。但是初看源码我是真的不知道要怎么看,该看些什么。但是最近通过看别人的博客,看些书,渐渐的就发现了一些不一样的东西,这只是自己的理解,大神路过就好,莫喷。

   java基本数据类型有8个,byte,short,int,long,float,double,char,boolean这8个,String类型并不包含在其中。同时String类为不可变类。那么我不禁会思考String的不可变类究竟是如何实现的?以及为什么需要这样设计呢?这样设计的好处是什么?(以前从来没想过,最近看源码一直不知道该怎么去看,所以决定带着疑问去看源码,这样会好很多,所以根据平时所学去研究究竟怎么做到这样子以及为什么这样子做)

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence       

    从这段代码中看以看到String类被定义为了final类型。final就代表了不可改变,所以这可能就是为什么说String类为不可变类型的原因。

     相比较而言可以对比StringBuffer和StringBuilder。因为经常我们在面试的时候会听到面试官问我们String,StringBuffer和StrignBuilder之间的区别是什么。

public final class StringBuffer
   extends AbstractStringBuilder
   implements java.io.Serializable, CharSequence      
public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence      

      以上就是StringBuffer和StringBuilder的类的源码,我们发现StringBuffer和StringBuilder都是final类型,但是在实际的开发中我还没有听说过StringBuffer和StringBuilder也是不可变类的说法,所以我也挺疑惑的。度娘查询了一波,类被定义为final类型代表着该类为最终类型,不可被继承的意义。

      在这里又学习到了一波类上面被定义为final类型的主要意义在于不可被继承,该类为最终类。那么String类不可变的原因究竟是什么呢。

      再看上面的源码我们知道StringBuilder和StrigBuffer继承自AbstractStringBuilder。继承关系如下

                                           StringBuffer

AbstractStringBuilder         StringBuilderString

      同时我们看AbstractStringBuilder的源码可以看到

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char[] value;
      

     但是我们看String的源码可以看到

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
      

    两者之间的差别显而易见。也就是在定义value[]这个字段的时候一个为final类型和一个没有final类型之间的区别。在我实际开发的过程中final类型都是会被定义为常量,而像String类的这种写法也就代表着它只能被赋值一次。后面都将不会再被赋值。这也就是如何实现String不可改变的方式。

    至于这样做的好处是什么,读过一些相关的博客以及别人的理解,发现好像是说在多线程环境下面的问题。在多线程环境下String类如果内容是可变的,将会出现不可预知的问题发生。感觉虽然只是了解了个小东西已经写了很多东西了,剩下的后面再写了。打算是先看些简单的源码,后续会看spring和mybatis的源码,看别人究竟是如何实现相对应的功能的。以及设计模式是如何在这些场景下面应用的,以及为什么这么用。

继续阅读