这是关于String类型的介绍,查看的源码是通过idea查看1.8的
一 实现的接口
1.java.io.Serializable
这个序列化接口是一个空接口,也就是说这个接口没有声明任何的方法,所以实现这个接口的类也就不需要实现任何的方法。 仅用于标识序列化的语意。
2.Comparable
这个接口只有一个compareTo(T 0)接口,用于对两个实例化对象比较大小。
3.CharSequence
这个接口是一个只读的字符序列。包括length(), charAt(int index), subSequence(int start, int end)等几个API接口,值得一提的是,StringBuffer和StringBuild也是实现了改接口。
二 成员变量
1.可以看到,char value[]是存储String的内容的,所以使用String str = “abc”;的时候,本质上,"abc"是存储在一个char类型的数组中的,而且是被final所修饰的。
2.而hash是String实例化的hashcode的一个缓存。因为String经常被用于比较,比如在HashMap中。如果每次进行比较都重新计算hashcode的值的话,那无疑是比较麻烦的,而保存一个hashcode的缓存无疑能优化这样的操作。
三 内部类
String只有一个内部类:
public static final Comparator<String> CASE_INSENSITIVE_ORDER
= new CaseInsensitiveComparator();
private static class CaseInsensitiveComparator
implements Comparator<String>, java.io.Serializable {
// use serialVersionUID from JDK 1.2.2 for interoperability
private static final long serialVersionUID = 8575799808933029326L;
public int compare(String s1, String s2) {
int n1 = s1.length();
int n2 = s2.length();
int min = Math.min(n1, n2);
for (int i = 0; i < min; i++) {
char c1 = s1.charAt(i);
char c2 = s2.charAt(i);
if (c1 != c2) {
c1 = Character.toUpperCase(c1);
c2 = Character.toUpperCase(c2);
if (c1 != c2) {
c1 = Character.toLowerCase(c1);
c2 = Character.toLowerCase(c2);
if (c1 != c2) {
// No overflow because of numeric promotion
return c1 - c2;
}
}
}
}
return n1 - n2;
}
/** Replaces the de-serialized object. */
private Object readResolve() { return CASE_INSENSITIVE_ORDER; }
}
四 构造器
String支持多种构造方法,但本质上都是将接受到的参数传给局部变量value[]。
new String()的时候是创建长度为0的字符串,也就是说是可以直接利用 “” 的char数组。
五 方法
//求字符串长度,可以看到是调用的字符数组的length属性,但是在字符串却是方法
public int length() {
return value.length;
}
//也是调用数组的长度属性,判断是不是为0
public boolean isEmpty() {
return value.length == 0;
}
//调用的数组的方法,根据索引获得值
public char charAt(int index) {
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index];
}