我有很多概念都沒明白,現在反過頭來認識。
Object是所有類的父類。
java.lang.String也是繼承自java.lang.Object中。
先比較一下2個類的toString()、equals()、= = (很多面試題都有),再來說一下String 的特殊。
2個類toString()的比較:
class Test {
public static void main(String [] args) {
Object obj = new Object();
Dog d = new Dog();
String s = new String("abc");
System.out.println("obj = " + obj);
System.out.println("d = " + d);
System.out.println("s = " + s);
}
}
class Dog {}
結果:
obj = java.lang.Object@c17164
d = Dog@1fb8ee3
s = abc
查閱API文檔:
Object類的 public String toString() returns
getClass().getName() + '@' + Integer.toHexString(hashCode())
String類的 public String toString() returns
the string itself.
說明String類重寫了Object的toString方法。
2個類equals()、= =比較:
class Test {
public static void main(String [] args) {
//比較equals()和==
Dog d1 = new Dog(1);
Dog d2 = new Dog(1);
System.out.println("d1 == d2 " + (d1 == d2)); //false
System.out.println("d1.equals(d2) " + d1.equals(d2)); //false
String s1 = new String("abc");
String s2 = new String("abc");
String s3 = "abc";
System.out.println("s1 == s2 " + (s1 == s2)); //false
System.out.println("s1.equals(s2) " + s1.equals(s2)); //ture
System.out.println("s1 == s3 " + (s1 == s3)); //false
System.out.println("s1.equals(s3) " + s1.equals(s3)); //true
}
}
class Dog {
private int i;
Dog(){}
Dog(int i){
this.i = i;
}
}
"=="是比較2個對象的引用是否指向同一個地址,如果是比較2個基本類型,那么就是比較2個值是否相等。
我new了2個Dog類,他們2個對象的棧引用肯定不能指向同一個堆地址。第二個String對象"=="的比較也是同樣道理。所以都返回了false(第三個比較體現了String的特殊類,等下說明)。
查閱jdk的源代碼:"equals"在Object中定義為
public boolean equals(Object obj) {
return (this == obj);
}
這就表示一個類如果沒有重寫該方法的話,它就是比較兩個的引用是否指向了同一個地址(和"=="比較是一致的)。
類庫里的類基本都重寫的該方法,所以是比較2個對象的內容是否一樣的(String方法重寫了該方法,所以第二個equals比較返回ture),對于外面自己自定義的類,則需要自己重寫該方法來達到內容是否相等的邏輯。
特殊對象String的equals()、= =比較:
String s = newString("abc");和String s = "abc";
首先2個對象在內存分布上是不一樣的。第2個對象是s的棧引用指向數據片段區的地址(存放字符串常量,靜態成員變量)。第1個new出來的對象是s的棧引用指向堆中的地址(存放在堆中)。通過API文檔:新創建的字符串對象s是該參數字符串("abc")的副本。
所以如代碼所表示:"=="比較是不一樣的,equals方法由于String重寫了,比較是字符序列。
String s1 = "abc" 和 String s2 = "abc"比較;
"=="和equals方法都返回ture;
s1分配了字符常量"abc",那么再有"abc"要引用給對象,都不會再分配內存空間了。
所以s1 和s2 指向的空間相同,內容也相同。