一、String类的不可变性
源码:
public final class String//final修饰类,不可继承
private final char value[];//String类实际返回值为final修饰的char数组,其对象内容
1、测试数组char数组能否代替字符串
public static void main(String[] args) {
String str = "abc";
char[] ch = {'a','b','c'};
System.out.println(str);
System.out.println(ch);
}
结果:可替代
abc
abc
2、测试String类是否可变
public static void main(String[] args) {
String str = "abc";
String t1 = str;
str = "ab";
String t2 =str;
//假如String可变,t1=t2,反之,t1!=t2
System.out.println(t1==t2);
}
public static void main(String[] args) {
StringBuilder str = new StringBuilder("abc");
StringBuilder t1 = str;
StringBuilder t2 =str.append("d");
//假如String可变,t1=t2,反之,t1!=t2
System.out.println(t1==t2);
}
结果:不可变
false
true
二、String类常用构造
源码:
public String() {
this.value = "".value;
}
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
1、为何采用Arrays.copyof而非直接用this.value=value
传递的value为可变对象,将this.value指向它时,则this.value失去不可变性,而Arrays.copyof采用浅复制,保留了this.value的不可变性
2、源码复制过来一堆错?
。。。。源码中很多东西,你是没有使用权限的
三、String类常用方法
源码:
1、length()获取字符串长度
//其实就是获取char数组元素个数
public int length() {
return value.length;
}
2、isEmpty()判断是否为空
//假如字符串为null,则无法使用
public boolean isEmpty() {
return value.length == 0;
}
3、charAt(int i)获取指定位置字符
//返回字符数组指定元素
public char charAt(int index) {
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
retur