String类源码分析 -- by maxwell
今天把String类的源码看了一遍,该类大概2000多行代码,注释就有1000多行。这个类主要都是对char[]的操作。
我大概注释了60%左右的方法,重要的方法做了分析注释,对这些方法也算有了比较深刻的认识。
//将此 String 中的所有字符都转换为小写。
//实际调用的重载方法,该实现相当复杂,因为该方法考虑的各种语言环境
public String toLowerCase() {
return toLowerCase(Locale.getDefault());
}
//将此 String 中的所有字符都转换为大写。
//实际调用的重载方法,该实现相当复杂,因为该方法考虑的各种语言环境
public String toUpperCase() {
return toUpperCase(Locale.getDefault());
}
//去除字符串两端的空格
//这个思路很经典!
public String trim() {
int len = value.length; //尾指针
int st = 0; //头指针
char[] val = value; /* avoid getfield opcode */
//st<len 保证头指针一直在尾指针之前
while ((st < len) && (val[st] <= ' ')) { //如果开始为空格
st++; //头指针向后移动
}
while ((st < len) && (val[len - 1] <= ' ')) { //如果末尾为空格
len--; //尾指针向前移动
}
return ((st > 0) || (len < value.length)) ? substring(st, len) : this; //String类中用了很多三元运算符
}
//将此字符串转换为一个新的字符数组。
//这里可以看到直接使用了System.arraycopy()方法
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;
}
//使用指定的格式字符串和参数返回一个格式化字符串。
//注意:这里有可变参数。实际上可变参数是一个数组。
public static String format(String format, Object... args) {
return new Formatter().format(format, args).toString();
}
//返回 Object 参数的字符串表示形式。
//下面一系列的valueOf()方法,实现方式基本都是使用包装类的toString()方法,或直接使用String的构造方法。
//下面的方法都是静态的,所以可以直接使用类名调用!
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
public static String valueOf(float f) {
return Float.toString(f);
}
public static String valueOf(double d) {
return Double.toString(d);
}
public static String valueOf(int i) {
return Integer.toString(i);
}
public static String valueOf(long l) {
return Long.toString(l);
}
public static String valueOf(boolean b) {
return b ? "true" : "false";
}
public static String valueOf(char c) {
char data[] = {c};
return new String(data, true);
}
public static String valueOf(char data[]) {
return new String(data);
}
|
|