我有很多概念都没明白,现在反过头来认识。
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 指向的空间相同,内容也相同。