String字符串的使用
/**
* String字符串的使用
*/
public class TestString {
public static void main(String[] args) {
String s1 = "s1";
String s2 = new String("s2");
//"s1"默认省略了new String()
String s3 = "";
//空字符串也是一个字符串,不是空的
String s0 = null;
// =null才是空的 这里和对象的引用一样 String引用变量s0指向null空 没有指向实际地址 没有生成新对象
System.out.println(s1.length());
//打印字符串s1的长度:2
System.out.println(s3.length());
//打印字符串s3的长度:0
/*
System.out.println(s0.length())会报错 NullPointerException 空指针异常
s0指向null 没有实际对象,所以没法通过对象调用方法
*/
/*打开String源码

package java.lang; //String类属于java.lang包 默认载入无需import导入
public final class String //public完全公开 final class不可继承
implements java.io.Serializable, Comparable<String>, CharSequence { //implements实现三个接口,用逗号隔开
private final char value[]; //private私有属性只能类内调用 final char只可以初始化一次之后不能更改 value[]数组
public String() {this.value = "".value;} //无参构造器 即 new String()时赋值空字符串""的value
"s1"属于String类对象
String s1 = "s1";是把"s1"对象的地址赋值给s1
String s2 = new String("s2"); 是先new一个String对象 将"s2"的value和hash赋值给String对象 再将对象的地址赋值给s2
public int length() {return value.length;}//返回this.value.length数组的长度
public boolean equals(Object anObject) {
//String对Object的equals方法重写 这里形参是Object类不是String类
if (this == anObject) {
//比较对象地址是不是同一个对象
return true;
}
if (anObject instanceof String) {
//判断要比较的anObject是否属于String类 由于String对equals重写 所以调用重写的equals的对象this属于String类 如果要比较的对象不属于String类意味着比较双方不同类
String anotherString = (String)anObject;
//在确认比较对象属于String类后 由于形参编译类型是Object 这里要强转为String 才能使用String的内容
int n = value.length;
//计算this.value数组的长度
if (n == anotherString.value.length) {
//判断两字符串长度
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
//先判断n!=0 为ture的话再n--
//如果n=0 即两个字符串都是""空字符串,跳过循环体返回ture
if (v1[i] != v2[i])
//从第0位开始比较字符
return false;
i++;
}
return true;
}
}
return false;
}
public String toString() {return this;}//源toString是返回包名.类名.对象名@地址 重写后返回字符串内容

*/
}
}