3/23学习String源码笔记记录

1.fileds:

    一、private static final long serialVersionUID = -6849794470754667710L;

            补充知识点:String实现了序列化接口,对于序列化的操作,需要所有补充:

             java序列化操作:

            将对象A->序列化->文本->反序列化->对象B。这个过程中,序列化时会将serialVersionUID写入文本并在反序列化时与提供的类中的UID比较,如果不同,会抛出异常。通常给予默认long值1L。如果A类缺失属性,则B类中补充属性并赋予初始值;如果B类缺失属性则直接丢弃。这里需要注意一点,序列化的目的是为了保存对象的状态,所以静态变量并不在序列化范围之内!(通常可以用序列化优雅的做深克隆)

            还有一点值得一提:如果父类没有实现序列化接口,子类实现,将子类对象序列化,反序列化再输出父类属性会出现偏差,其原因在于构造子类必须先构造父类,而父类没有实现序列化,所以只能构造完给上初始值(数值0,引用null)就放着不管了。同样的transient关键字可以屏蔽不想被序列化的属性,他们被反序列化出来也是初始值。

    二、滞留问题:关于java中的codePoint以及codeUnit(核心卷)

    三、构造方法:

        1.一个值得注意的构造方法:

    String(char[] value, boolean share) {
        // assert share : "unshared not supported";
        this.value = value;
    }

        value是String类下的一个数组属性,这里采取了直接将数组引用拿来赋值。这样打破了String类是不可变(引用数组一旦改变,两个String都会改变)这个性质。所以被设置为了受保护的方法。关于这个方法,下面还会继续分析。

        2.其余的构造方法,基本都是通过字符数组进行构造,或者对比特数组进行解码(传入字符编码集)。也可以通过传入String,StringBuilder,StringBuffer来构造新的String。

    四、常用方法

        1.比较方法

    public int compareTo(String anotherString)

        这个方法需要注意,提供的是根据char的值排序的。所以会出现小写z也比大写A大的情况。具体情况需要写其他方法比较,比如compareToIgnoreCase()这个无视大小写的排序。

    public boolean regionMatches(boolean ignoreCase, int toffset,String other, int ooffset, int len)
        这个方法传入五个参数,分别是是否区分大小写,当前字符串起始位置t,比较字符串,比较字符串起始位置o,比较长度。返回t,t+l与o,o+l的字符是否匹配。

        2.其他方法

        基本上都是返回一个新的String。这需要注意。

        3.join方法

        可以用来以分隔符连接若干String成为一个新的String。

        4.toCharArray方法的注意点:

        牵扯到一个类加载问题,系统加载时先加载String,后加载Arrays,因此不能再String中用到Arrays工具类,System类可以。

        5.intern方法:

        一定返回从常量池中获取的当前字符串。

            

猜你喜欢

转载自blog.csdn.net/zkANewer/article/details/79668350