String源码阅读

2018-12-19  本文已影响0人  以梦为马驾驾驾

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

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

重载构造器

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对象,然而是包可见。

实用的方法:

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;
    }

重写的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

上一篇下一篇

猜你喜欢

热点阅读