String源码阅读

String类是final类,且实现了java.io.Serializable,Comparable,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源码阅读)