String类其实是对一个char[] 数组的封装。
底层数组
private final char[] value;
private int hash; //default 0;
public String(String original) { //constructor
this.value = original.value;
this.hash = original.hash;
}
//重载构造器,for subString().
public String(char value[], int offset, int count) {
if (offset < 0) {
throw new StringIndexOutOfBoundsException(offset);
}
if (count <= 0) {
if (count < 0) {
throw new StringIndexOutOfBoundsException(count);
}
if (offset <= value.length) {
this.value = "".value;
return;
}
}
// 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);
}
常见API
//判断空
public boolean isEmpty(){
return value.length == 0;
}
//返回长度
public int length(){
return value.length;
}
//返回指定位置的char
public char charAt(int i){
if (i < 0 || i >= value.length) //判断下标是否越界
throw new StringIndexOutOfBoundsException(i);
return value[i];
}
//数组截取
public String subString(int begin, int end) {
if (begin < 0)
throw new StringIndexOutOfBoundsException(begin);
if (end > value.length)
throw new StringIndexOutOfBoundsException(end);
int subLen = end - begin;
if (subLen < 0)
throw new StringIndexOutOfBoundsException(subLen );
return ((begin == 0) && (end == value.length)) ? this :
new String(value, begin, subLen); //操作底层数组
}
//equals()方法
public boolean equals(Object anotherObj) {
if (this == anotherObj) //指向同一对象
return true;
if (anotherObj instanceof String) {
int n = value.length;
if (n == anotherObj.value.length) { //底层数组长度相同
char1[] = value;
char2[] = anotherObj.value;
int i = 0;
while (n-- != 0) { //遍历比较每个char
if(char1[i] == char2[i])
return false;
i++
}
return true;
}
}
return false;
}