美文网首页
String源码阅读

String源码阅读

作者: 以梦为马驾驾驾 | 来源:发表于2018-12-19 11:34 被阅读0次

    String类是final类,且实现了java.io.Serializable,Comparable<String>,CharSequence 接口

    主要有三个属性,都是private:

    • 内部的字符存储是final 的char[], 由于没有暴露给外界的修改char[] 的接口,所以String是不可变对象
    • serialVersionUID用于序列化反序列化的验证
    • hash值

    重载构造器

    String重载了许多构造器方法,可以通过现有的String对象创建string对象(仅仅此方法对hash的值进行了更新),截取byte[]数组某段创建,通过char[]对象创建,通过存储着codepoint的int[]创建对象,甚至可以指定字符集。

    通过codepoint的数组创建对象时,涉及到的知识:BMP,utf-8,utf-16等,见链接:
    Plane
    utf-8
    utf-16
    在java中默认采用的是unicode字符集和utf-16编码.(对utf-16的编码方法了解不够,有一些codepoint的方法没看).

    发现了一个稍微有点特别的构造方法:

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

    value对象直接复制给String,share是true,为了保持封装,其他的方法都是利用Arrays.copyOf(char[] , length)或者是Arrays.copyOfRange([],offset, offset+count),所以这个构造方法可以创建出一个可变String对象,然而是包可见。

    实用的方法:

    • void getChars(char dst[] , int dstBegin): 此方法仅包可用,调用了System.arraycopy(source,sourceBegin, dst, detBegin,length);
    • public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin),同样调用了System.arraycopy();
    • public boolean equalsIgnoreCase(String anotherString)
    • public int compareToIgnoreCase(String str)
    • public boolean startsWith(String prefix)
    • public boolean endsWith(String suffix)
    • public int indexOf(int ch)
    • public int indexOf(int ch, int fromIndex)
    • public int lastIndexOf(int ch, int fromIndex)(searching backward starting at the specified index. )
    • static int indexOf(char[] source, int sourceOffset, int sourceCount,
      String target, int fromIndex)
    • public String substring(int beginIndex)并不能创建相同值的另一个String对象,因为beginIndex==0时返回this
    • public String concat(String str)
    char buf[] = Arrays.copyOf(value, len + otherLen);
    //Arrays.copyOf如下
    public static char[] copyOf(char[] original, int newLength) {
            char[] copy = new char[newLength];
            System.arraycopy(original, 0, copy, 0,
                             Math.min(original.length, newLength));
            return copy;
        }
    
    
    • public String replace(char oldChar, char newChar)
    • public boolean matches(String regex)
    • public boolean contains(CharSequence s)
    • public String toUpperCase()
    • public String trim()
    • public static String format(String format, Object... args
    • public static String valueOf(boolean b)
    • public native String intern();(原生方法)

    重写的equals方法:

    public boolean equals(Object anObject) {
            if (this == anObject) {
                return true;
            }
            if (anObject instanceof String) {
                String anotherString = (String)anObject;
                int n = value.length;
                if (n == anotherString.value.length) {
                    char v1[] = value;
                    char v2[] = anotherString.value;
                    int i = 0;
                    while (n-- != 0) {
                        if (v1[i] != v2[i])
                            return false;
                        i++;
                    }
                    return true;
                }
            }
            return false;
        }
    

    1. 如果是同一个对象,true
    2. anobject是否是string,不是false
    3. 此时先比较比较具体的值char v2[] = anotherString.value;之所以private的value可以被访问是因为在同一个类中
    String对象不仅可以和String对象比较还可以和CharSequence(contentEquals)对象,AbstractStringBuilder对象(private),StringBuffer对象(public boolean contentEquals)

    f

    相关文章

      网友评论

          本文标题:String源码阅读

          本文链接:https://www.haomeiwen.com/subject/pxscgftx.html