String源代码

参考博客:http://www.hollischuang.com/archives/99#

1. 定义

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

从该类的声明中我们可以看出String是final类型的,表示该类不能被继承,同时该类实现了三个接口:java.io.Serializable、 Comparable<String>、 CharSequence

2. 属性

/** Cache the hash code for the string */
private int hash; // Default to 0

/** The value is used for character storage. */
//注意value里面的值是可以被改变的
private final char value[];

这是一个字符数组,并且是final类型,他用于存储字符串内容,从fianl这个关键字中我们可以看出,String的内容一旦被初始化了是不能被更改的。 虽然有这样的例子: String s = “a”; s = “b” 但是,这并不是对s的修改,而是重新指向了新的字符串, 从这里我们也能知道,String其实就是用char[]实现的。

3. 构造方法

1)使用字符数组或字符串构造字符串

public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
}

public String(char value[]) {
       //字符数组拷贝 
       this.value = Arrays.copyOf(value, value.length);
}

public String(char value[], int offset, int count) {
        if (offset < 0) {
            throw new StringIndexOutOfBoundsException(offset);
        }
        if (count < 0) {
            throw new StringIndexOutOfBoundsException(count);
        }
        // Note: offset or count might be near -1>>>1.
        //用减法 防止溢出
        if (offset > value.length - count) {
            throw new StringIndexOutOfBoundsException(offset + count);
        }
        //from to 
        this.value = Arrays.copyOfRange(value, offset, offset+count);
    }

使用byte数组构造String的时候,要注意编码的问题

4. 使用方法

  • length() 返回字符串长度

  • isEmpty() 返回字符串是否为空

  • charAt(int index) 返回字符串中第(index+1)个字符

  • char[] toCharArray() 转化成字符数组

  • trim() 去掉两端空格

  • toUpperCase() 转化为大写

  • toLowerCase() 转化为小写

  • String concat(String str) //拼接字符串

  • String replace(char oldChar, char newChar) //将字符串中的oldChar字符换成newChar字符
    //以上两个方法都使用了String(char[] value, boolean share);

  • boolean matches(String regex) //判断字符串是否匹配给定的regex正则表达式

  • boolean contains(CharSequence s) //判断字符串是否包含字符序列s

  • String[] split(String regex, int limit) 按照字符regex将字符串分成limit份。

  • String[] split(String regex)

    //获取字符串的长度
    public int length() {
        return value.length;
    }
   //判断字符串是否为空
    public boolean isEmpty() {
        return value.length == 0;
    }
    //获取索引index下的字符
    public char charAt(int index) {
        if ((index < 0) || (index >= value.length)) {
            throw new StringIndexOutOfBoundsException(index);
        }
        return value[index];
    }
    //转换为字符数组
    public char[] toCharArray() {
        // Cannot use Arrays.copyOf 由于类初始化问题
        char result[] = new char[value.length];
        System.arraycopy(value, 0, result, 0, value.length);
        return result;
    }
    //去除两端的空格
    public String trim() {
        int len = value.length;
        int st = 0;
        char[] val = value;    /* avoid getfield opcode */

        while ((st < len) && (val[st] <= ' ')) {
            st++;
        }
        while ((st < len) && (val[len - 1] <= ' ')) {
            len--;
        }
        return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
    }
    //截取子字符串
    public String substring(int beginIndex, int endIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        if (endIndex > value.length) {
            throw new StringIndexOutOfBoundsException(endIndex);
        }
        //字符个数
        int subLen = endIndex - beginIndex;
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
        return ((beginIndex == 0) && (endIndex == value.length)) ? this
                : new String(value, beginIndex, subLen);
    }
    //其他略

5. 比较方法

equals

public boolean equals(Object anObject) {
        //对象是否相等
        if (this == anObject) {
            return true;
        }
        //因为String是final类型的
        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;
    }

你可能感兴趣的:(字符串)