String字符串的使用
/**
* String字符串的使用
*/
public class TestString {
? ?public static void main(String[] args) {
? ? ? ?String s1 = "s1";
? ? ? ?String s2 = new String("s2");
? ? ? ?//"s1"默認(rèn)省略了new String()
? ? ? ?String s3 = "";
? ? ? ?//空字符串也是一個(gè)字符串,不是空的
? ? ? ?String s0 = null;
? ? ? ?// =null才是空的 這里和對象的引用一樣 String引用變量s0指向null空 沒有指向?qū)嶋H地址 沒有生成新對象
? ? ? ?System.out.println(s1.length());
? ? ? ?//打印字符串s1的長度:2
? ? ? ?System.out.println(s3.length());
? ? ? ?//打印字符串s3的長度:0
? ? ? ?/*
? ? ? ?System.out.println(s0.length())會(huì)報(bào)錯(cuò) NullPointerException 空指針異常
? ? ? ?s0指向null 沒有實(shí)際對象,所以沒法通過對象調(diào)用方法
? ? ? ? */
? ? ? ?/*打開String源碼

? ? ? ?package java.lang; //String類屬于java.lang包 默認(rèn)載入無需import導(dǎo)入
? ? ? ?public final class String ?//public完全公開 final class不可繼承
? ? ? ?implements java.io.Serializable, Comparable<String>, CharSequence { ?//implements實(shí)現(xiàn)三個(gè)接口,用逗號(hào)隔開
? ? ? ?private final char value[]; ?//private私有屬性只能類內(nèi)調(diào)用 final char只可以初始化一次之后不能更改 value[]數(shù)組
? ? ? ?public String() {this.value = "".value;} //無參構(gòu)造器 即 new String()時(shí)賦值空字符串""的value
? ? ? ?"s1"屬于String類對象
? ? ? ?String s1 = "s1";是把"s1"對象的地址賦值給s1
? ? ? ?String s2 = new String("s2"); 是先new一個(gè)String對象 將"s2"的value和hash賦值給String對象 再將對象的地址賦值給s2
? ? ? ?public int length() {return value.length;}//返回this.value.length數(shù)組的長度
? ?public boolean equals(Object anObject) {
? ?//String對Object的equals方法重寫 這里形參是Object類不是String類
? ? ? ?if (this == anObject) {
? ? ? ?//比較對象地址是不是同一個(gè)對象
? ? ? ? ? ?return true;
? ? ? ?}
? ? ? ?if (anObject instanceof String) {
? ? ? ?//判斷要比較的anObject是否屬于String類 由于String對equals重寫 所以調(diào)用重寫的equals的對象this屬于String類 如果要比較的對象不屬于String類意味著比較雙方不同類
? ? ? ? ? ?String anotherString = (String)anObject;
? ? ? ? ? ?//在確認(rèn)比較對象屬于String類后 由于形參編譯類型是Object 這里要強(qiáng)轉(zhuǎn)為String 才能使用String的內(nèi)容
? ? ? ? ? ?int n = value.length;
? ? ? ? ? ?//計(jì)算this.value數(shù)組的長度
? ? ? ? ? ?if (n == anotherString.value.length) {
? ? ? ? ? ?//判斷兩字符串長度
? ? ? ? ? ? ? ?char v1[] = value;
? ? ? ? ? ? ? ?char v2[] = anotherString.value;
? ? ? ? ? ? ? ?int i = 0;
? ? ? ? ? ? ? ?while (n-- != 0) {
? ? ? ? ? ? ? ?//先判斷n!=0 為ture的話再n--
? ? ? ? ? ? ? ?//如果n=0 即兩個(gè)字符串都是""空字符串,跳過循環(huán)體返回ture
? ? ? ? ? ? ? ? ? ?if (v1[i] != v2[i])
? ? ? ? ? ? ? ? ? ?//從第0位開始比較字符
? ? ? ? ? ? ? ? ? ? ? ?return false;
? ? ? ? ? ? ? ? ? ?i++;
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?return true;
? ? ? ? ? ?}
? ? ? ?}
? ? ? ?return false;
? ?}
? ? ? ?public String toString() {return this;}//源toString是返回包名.類名.對象名@地址 重寫后返回字符串內(nèi)容

? ? ? ? */
? ?}
}