String类是java.lang下一个非常重要的类,String本身又是很常用的数据类型,因此,剖析String类变的十分重要。
首先,我们来看看jdk源码中对String类的解释:
Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings.
字符串是常量,在创建后,字符串的值就不能改变,不过,stringbuffer(字符串缓冲区)支持可变的字符串.而正因为字符串不可变,所以字符串能够被共享。
在源码中,开发人员给了一个小例子,来形象的说明String的本质:
char data[] = {'a', 'b', 'c'};
稍微有点java基础的人都清楚,char是java中八种基本数据类型的其中一种,代表的是一个字符。这里的data[]是一个字符的数组。
String str = new String(data);
str是一个常用的创建一个字符串的方式,在源码中,他们被认为是相同的,也就是说,字符串就是一个一个的字符拼接起来的。
String 类被final修饰,不能被继承,同时,它实现了java.io.Serializable, Comparable<String>, CharSequence 借口,接下来,我们来看看具体的方法.
这里可以看一下java源码中变量的注释风格哦!
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
1 .String类的构造方法,首先可以看一看string的构造方法,很有意思.
public String() {
this.value = new char[0];
}
String的构造方法创建了一个空的字符数组。
2.第二个构造方法
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
这个方法的源码里有讲到,新创建的字符串是原字符串original的一个副本,从构造方法里,我们可以很清晰的看到,将original的value和hash都赋值给了新的对象引用。
3.第三个构造方法
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
同理,是复制的字符串数组的某一部分.
4.第四个构造方法
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);
}
this.value = Arrays.copyOfRange(value, offset, offset+count);
}
这个方法传入一个字符数组, 一个int类型的偏移量,还有一个长度。在方法里,分别对不同的情况抛出了异常,并调用了工具类Arrays.copyOfRange方法,接下来,让我们来看看这个方法。
public static char[] copyOfRange(char[] original, int from, int to) {
int newLength = to - from;
if (newLength < 0)
throw new IllegalArgumentException(from + " > " + to);
char[] copy = new char[newLength];
System.arraycopy(original, from, copy, 0,
Math.min(original.length - from, newLength));
return copy;
}
该方法是复制数组到另一个新的数组,其中,初始索引必须在0和original.length之间,否则会超出范围。然后调用了arraycopy方法,来复制一个新的数组。
其余的构造方法,就不在此描述,大同小异,我们来看看其余的方法。
5.第五个方法
public int length() {
return value.length;
}
一般来说,获得字符串的长度。
6.第6个方法
public boolean isEmpty() {
return value.length == 0;
}
如果字符串的长度等于0,那么就返回为true,否则就返回为false