1、类关系解析
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
String是被final修饰的类,final关键字是不可变的,也就是说String不能被继承,并且创建完对象后这个对象引用不能被修改,其次String实现了序列化接口(Serializable),该接口可让对象以流的方式进行传输,然后又实现了Comparable类,该类是用来比较排序的,还有CharSequence接口,这个接口蛮重要的,因为string是字节码他与汉字需要流交互的,所以CharSequence接口可以对字符进行字节码和字符之间的转换。
2、常用方法:
2.1、构造函数
@Stable //value变量是Byte数组是用于存储字节的,字节是数字,不同的数字代表不同的字符
private final byte[] value;
//有参构造 :使其表示与参数相同的字符序列;换句话说,新创建的字符串是参数字符串的副本
@HotSpotIntrinsicCandidate
public String(String original) {
this.value = original.value;
this.coder = original.coder;
this.hash = original.hash;
}
//无参构造 :使其表示空字符序列。注意,没有必要使用这个构造函数,因为字符串是不可变的。
public String() {
this.value = "".value;
this.coder = "".coder;
}
String str = new String();会调用无参构造,String str = new String("str");会调用有参构造,如果有参数会将参数赋值给value,但是我们不常用这种new对象的方式,我们用语法糖String str = "str";这种方式创建对象,但是他似乎没有调用构造函数,你说它不是一个对象嘛?那肯定是一个对象,但是它如何构造的对象,这个我不晓得- -,它构造的过程是先从jvm常量池中查看是否有相同字符串,如果有直接将引用指向字符串,如果没有就创建对象。
这些都是String的构造函数,总之就是将穿进来的对象或者字节数组等等转换为String对象,其实String对象返回的也是字节码,String只是一个对象,他的字符内容全在byte[] value的数组变量里。
2.2、valueOf方法
//将Object转换为String对象
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
//将Unicode转换为String对象
public static String valueOf(char data[]) {
return new String(data);
}
//将指定Unicode转换为String对象
public static String valueOf(char data[], int offset, int count) {
return new String(data, offset, count);
}
//将data[] 数组指定创建成String对象
public static String copyValueOf(char data[], int offset, int count) {
return new String(data, offset, count);
}
//将data[] 数组创建成String对象
public static String copyValueOf(char data[]) {
return new String(data);
}
//将b为true则为字符串"true"为false则为字符串"false"
public static String valueOf(boolean b) {
return b ? "true" : "false";
}
//将c 用于表示 `UTF-16` 编码方式下的一个字符
public static String valueOf(char c) {
if (COMPACT_STRINGS && StringLatin1.canEncode(c)) {
return new String(StringLatin1.toBytes(c), LATIN1);
}
return new String(StringUTF16.toBytes(c), UTF16);
}
//将i
public static String valueOf(int i) {
return Integer.toString(i);
}
public static String valueOf(long l) {
return Long.toString(l);
}
public static String valueOf(float f) {
return Float.toString(f);
}
public static String valueOf(double d) {
return Double.toString(d);
}