String world = new String("world");
String world2 = new String("world");
System.out.println(world==world2); //字符串对象引用的比较,在堆内存中,因为2个对象内存地址不同,输出false。
System.out.println(world.equals(world2)); //比较的依然是字符串的字面值,所以输出结果为true。
world = new String("hello world");
//创建一个新的字符串对象"hello world",把在堆中内存地址赋值给world,而原来world所指向的字符串对象"world"则因为没有被用到,而被当做垃圾,会给系统回收掉。
//当然啦,world2 指向的对象还在的。
System.out.println(world.equals(world2)); //world值已变,输出false
System.out.println(world2); //输出 world
System.out.println(hello0_0 ==hel+lo); //输出false
// hel + lo :变量+变量是属于一种动态字符串,在运行时计算,创建一个新的字符串,与在字符串池中的"hello"不同,估计是new出来的,或者无法比较,有谁知道可以告诉一下
//官方解释:Strings computed at run time are newly created and therefore distinct.
//中文解释:在运行期计算的字符串是即时创建的,所以是不同的对象。
}
}
class Student{
String name;
public Student(String name){
this.name = name;
}
@Override
public boolean equals(Object anObject){
if (this == anObject) { //this 表示调用equals()方法的对象的引用,anObject表示,equals()方法的参数(需比较的对象的引用)。
return true; //进入这个if,表示自己与自己比较
}
if (anObject instanceof Student) { //同一个对象的实例才比较,否则返回false
Student anStudent = (Student)anObject;
if (this.name != anStudent.name) {
return false;
}
return true;
}
return false;
}
}[/code]String的equals()的源码[code=java] public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}[/code]Object的equals()源码[code=java]public boolean equals(Object obj) {
return (this == obj);
}[/code]
[ 本帖最后由 覃俊瑞 于 2011-07-21 21:30 编辑 ]