String类被final修饰,它不能被继承。数据对象存放在char类型的数组里。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
……
……
……
}
String类型的equals方法,比较的是两个String对象的char数组下同一个索引位置里的字符要一致。
String类型的hashCode方法,计算方式是循环char数组,从数组索引第0位开始到末尾,每个字符串的ASCII码值 + 循环经过的几个字符的hashcode值 * 31 的到的结果。如果字符串长度等于1,那么hashcode值就是这独一的字符的ascii码;长度为2,就是第一位的ascii码值 * 31 + 第2位的码值;长度为3,就是(第一位的ascii码值 * 31 + 第2位的码值的结果) * 31 + 第3位的码值;
String类型的compareTo方法,比较大小是根据char数组里同一索引位置的字符大小进行比较。
String类型的常用方法:
String类型支持构造器创建String对象。支持无参、char[]、byte[]等。
String类型的方法里前缀含有codePoint的,意味着是对char数组里字符的ASCII码的相关获取或者处理,例如codePointAt(int),获取指定索引位char字符的码值。
String类型的getBytes方法,是将char数组里的字符转成byte类型的数组(此时就纯数字了)返回。
String类型的startWith、endWith,比较的是char数组的前缀或后缀的数组字符,与参数前缀是否一致。
String类型的indexOf、lastIndexOf方法,查看的是char数组里是否包含指定的字符、字符串等,并返回其的索引位置。
String类型的subString方法,用来从char数组里某索引做开始,某索引做截止,复制这一小段范围的数组内容作为一个新的String对象,不更改原String对象。
public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > value.length) {
throw new StringIndexOutOfBoundsException(endIndex);
}
int subLen = endIndex - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return ((beginIndex == 0) && (endIndex == value.length)) ? this
: new String(value, beginIndex, subLen);
}
String类型的concat方法,是将两个String对象合并成一个String对象,本质是将两个短数组拼成一个长数组,并生成新的String对象,不更改原两个String对象。
String类型的split方法,内部是通过indexOf找到分割标记的字符串位置,然后通过subString截取指定范围内数组作为新的字符串保存在列表中,最后将数组里剩余的部分当作一个独立字符串。将列表转为数组作为结果返回。
String类型的join方法,用于将一个数组里的字符串通过一个指定的分割符合并成一个独立的字符串,第一个参数是分隔符,第二个参数是字符串数组或者列表。
System.out.println(String.join("ss","v1","v2","v3"));
List<String> list = new ArrayList<>();
list.add("o1");
list.add("o2");
list.add("o3");
System.out.println(String.join("-", list));
结果:
v1ssv2ssv3
o1-o2-o3
String类型的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;
}