1.简介
String类用来表示字符串,程序中的“abc”等字符串字面量就是其实例。
String是个不可变类,就是虽然它底层实现的一个字符数组,但是不能够修改字符数组的某个字符。因此它是可以多线程间共享的(线程安全的)。
2.字段&构造
由于String底层也是char数组,char类型在内存中是由两个字节Unicode编码(UTF-16)表示,每个字符值都在[\u0000,\uFFFF]这个范围。所以在内存中每个字符是两个字节。
UTF-16用两个字节来表示Unicode转化格式,它是定长的表示方法,不论什么字符都可以用两个字节表示,两个字节是16个bit,所以叫UTF-16。UTF-16表示字符非常方便,每两个字节表示一个字符,这就大大简化了字符串操作,这也是Java以UTF-16作为内存的字符存储格式的一个很重要的原因。
字段 | 作用 |
---|---|
char[] value | 字符数组 |
int hash | 缓存该字符串的hash值 s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 空串为0 |
long serialVersionUID = -6849794470754667710L | 序列化标识 |
// 1.空串,很少使用
public String() {
this.value = "".value;
}
// 2.复制串,浅复制,指向同一个字符数组,但由于不可变,可以共享
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
// 3.深复制,因为字符数组曝露在外,如果不拷贝不能保证其不可变
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
char data[] = {'a', 'b', 'c'};
String str = new String(data);
String origin = "abc"; // 字面量会在编译、加载时,jdk7在堆中创建String对象,并将其引用放入常量池
String copy = new String(origin);
字符串初始化分为以下三种,各个方式创建对象的数量不一样,如下表所示:
字符串初始化 | 对象图解 | 解释 |
---|---|---|
String origin = "abc"; | ![]() | 没有创建新对象 字符串字面量(“abc”)会在类加载时,jdk7在堆中创建String对象,并将其引用放入常量池。 此时的赋值就是栈中复制常量池中的引用,不会调用构造函数创建新的对象。 |
new String(origin) | ![]() | 会创建一个对象 String类型的对象指向与origin对象相同的字符数组。 |
new String(charArray) | ![]() | 创建两个对象 一个String对象,一个底层存储字符的char[]数组 因为其不可变性,一定会深拷贝暴露在外的字符数组。 |
3.核心方法
方法 | 功能 | 样例 |
---|---|---|
length() | 返回字符数组value.length | “abc”.length() ==3 |
charAt(int index) | 返回数组下标index下的字符,return value[index] | |
compareTo(String another) | 比较字典序 小于返回负数,等于返回0,大于返回正数 | “abcd” >"abc" "abcd" <"abd" |
startsWith(String prefix) | 是否以prefix开头 | |
endWith(String suffix) | 是否以suffix结尾 | |
indexOf(int ch) | 返回字符ch所在的第一个下标 | |
indexOf(String str) | 返回字符串str所在的第一个下标 | |
substring(int beginIndex, int endIndex) | 返回子串,下标是左闭右开,包含beginIndex,不包含endIndex字符 | |
concat(String str) 、+ | 返回原串后面连接上str的串、连接两个字符串 | “abc”+“de” |
contains(CharSequence s) | 包含子串 | |
split(String regex) | 以regex为分割符分割成字符串数组 | |
matches(String regex) | 字符串正则匹配 | |
hashCode | 返回hash值 |
4.特性总结
不变性
线程安全