1. java.lang.Object 類。java.lang 包在使用的時候無需顯式導入,編譯時由編譯器自動導入。
2. API(Application Programming Interface),應用編程接口。
//Object class
public class ObjectTest{
public static void main(String args[]){
Object object = new Object(); //調用object構造方法
System.out.println(object); //打印object引用
System.out.println(object.toString()); //打印引用所指向對象的toString()方法的返回值
}
}
當打印引用時,實際上會打印出引用所指向對象的 toString() 方法的返回值,因爲每個類都直接或間接地繼承自 Object , 而 Object 類中定義了 toString(),因此每個類都會有 toString() 方法。3. equals() 方法解析
//Object類中equals()源碼解析
public class StringTest{
public static void main(String args[]){
String str = new String("aa");
String str2 = new String("aa");
System.out.println(str.equals(str2)); //String中的equals()方法。重寫Object中的equals()方法
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~");
String str3 = "aa";
String str4 = "aa";
System.out.println(str3.equals(str4));
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~");
Object object = new Object();
Object object2 = new Object();
System.out.println(object.equals(object2)); //Object中equals()方法是判斷調用 equals() 方法的引用與傳進來的引用是否一致。
System.out.println(object.equals(object));
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~");
}
}
Object中的equals()方法源碼
public boolean equals(Object obj) {
return (this == obj); //當前對象與傳進來的引用是否相同
}
Object的equals()總結:equals()方法,該方法定義在Object 類當中,因此java中的每個類都具有此方法,對於 Object 類的 equals() 方法來說,它是判斷調用 equals() 方法的引用與傳進來的引用是否一致,即這兩個引用是否指向的是同一個對象。對於Object 類的 equals() 方法來說,它等價於 ==。
//String中的 equals() 方法源碼
public boolean equals(Object anObject) {
if (this == anObject) { //如果引用相同返回true
return true;
}
if (anObject instanceof String) { //判斷當前參數是否是一個字符串實例
String anotherString = (String) anObject; //向下類型轉換
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) { //比較字符串內容是否完全相同
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
String的equals()總結:對於 String 類的 equals() 方法來說,它是判斷當前字符串與傳進來的字符串的內容是否一致。總結:對於 String 對象的相等性判斷來說,請使用 equals() 方法,而不要使用 ==。
4. String 是常量,其對象一旦創建完畢就無法改變。當使用+拼接字符串時,會生成新的String 對象,而不是向原有的String 對象追加內容。
5. String Pool (字符串池):
String str="aaa"(採用字面值方式賦值);
這句話完成兩步:1)查找 String Pool 中是否存在“aaa”這個對象,如果不存在則在String Pool 中創建一個“aaa” 對象,然後將String Pool中的這個“aaa”對象的地址返回來,賦給引用變量str,這樣str 會指向 String Poll 中的這個 “aaa” 字符串對象。
2)如果存在,則不創建任何對象,直接將 String Pool中的這個“aaa” 對象的地址返回來,賦給 str 引用。
String str = new String("aaa"); (採用 new 關鍵字方式賦值)
1)首先在 String Pool 中查找有沒有“aaa”這個字符串對象,如果有,則不在 String Pool 中再去創建“aaa”這個對象了,直接在堆中(heap)中創建一個“aaa”字符串對象,然後將堆中的這個“aaa” 對象的地址返回來,賦給 str 引用,導致 str 指向了堆中創建的這個“aaa” 字符串對象。
2)如果沒有,則首先在 String Pool 中創建一個“aaa” 對象,然後再在堆中(heap)創建一個“aaa”對象,然後將堆中的這個“aaa”對象的地址返回來,賦給 str 引用,導致 str 指向了堆中所創建的這個“aaa”對象。
public class ObjectTest2{
public static void main(String args[]){
Object object = new Object();
Object object2 = new Object();
System.out.println(object == object2);
System.out.println("------------------------------");
String str = new String("aaa");
String str2 = new String("aaa");
System.out.println(str == str2);
System.out.println("------------------------------");
String str3 = "bbb";
String str4 = "bbb";
System.out.println(str3 == str4);
System.out.println("------------------------------");
String str5 = new String("ccc");
String str6 = "ccc";
System.out.println(str5 == str6);
System.out.println("------------------------------");
String s = "hello";
String s1 = "hel";
String s2 = "lo";
System.out.println(s == s1 + s2); //查看第4點。如果用+號來實現String的串接時:1)僅當+號兩邊均爲字符串常量時,纔將其+後的結果當做字符串常量,且該結果直接放入String Pool。
System.out.println("------------------------------");
System.out.println(s == "hel" + "lo"); //兩個常量相加拼接,結果是true。例如3+5
System.out.println(s == ("hel" + s2)); //常量跟變量拼接,編譯器會認爲生成一個新的對象,結果是false。不同JVM實現方式不同,不必深究
System.out.println("hel" + s2);
System.out.println("100" + 200); //凡是跟字符串執行拼接操作,都會將非字符串變量或常量轉換成字符串,然後拼在一起。
System.out.println(s == ("hel" + s2).intern()); //只要調用intern()方法就會返回池中的引用
System.out.println(true + false); //Erro
System.out.println("true" + false); //會將Boolean類型轉爲字符串,然後拼接
}
}
參考:http://hi.baidu.com/hannick/item/f7b4e7ece6ddcb2b5a7cfb24
http://blog.sina.com.cn/s/blog_5203f6ce0100tiux.html