昨天是从前往后按照String的源码梳理的,今天从后往前梳理String的源码:
(1)String的intern()方法
返回字符串对象的规范表示,是动态地给常量池增加内容。当调用该方法时,若常量池中有该字符串,则返回该字符串,若没有,则将该字符串加入到常量池中,并且返回该字符串的引用。
public native String intern();
(2)valueOf(double d)
返回形参d的字符串形式
public static String valueOf(double d) {
return Double.toString(d);
}
(3)valueOf(char c)
返回单个字符的字符串形式
public static String valueOf(char c) {
char data[] = {c};
return new String(data, true);
}
String(char[] value, boolean share) {
// assert share : "unshared not supported";
this.value = value;
}
其中用这个构造方法,我们可以看到当前对象的value就指向的是形参这个数组,说明后续数组的改变会影响当前对象。
(4)static copyValueOf(char data[]),valueOf(char data[])
用形参数组的值构造一个新的String对象
public static String copyValueOf(char data[]) {
return new String(data);
}
public static String valueOf(char data[], int offset, int count) {
return new String(data, offset, count);
}
(5)toCharArray()
返回一个字符数组
public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
char result[] = new char[value.length];
System.arraycopy(value, 0, result, 0, value.length);
return result;
}
(6)trim()
去掉字符串的前缀和尾随的空格
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;
}