Object与String的equals()方法的比较传送门在此:http://bbs.itheima.com/forum.php?mod=viewthread&tid=252&reltid=12320&pre_pos=2&ext=
equals()方法一般用在String和实体类中。[code=java]package test;
public class StringTestTwo {
public static void main(String[] args) {
Object object = new Object();
Object object2 = new Object();
//Object 父类的比较,通过源代码知道,equals()方法比较的形式是:object == object2
System.out.println(object.equals(object2)); //false
//重写了Object类的equals()方法的学生类
Student student = new Student("zhangsan");
Student student2 = new Student("zhangsan");
System.out.println(student==student2); //false
System.out.println(student.equals(student2)); //true
//在重新equals()方法之前,不等;但在学生类自己重写了equals()方法后,可以让结果为true。指向同一对象
//现象例子,一个教室里只有一个人叫name是zhangsan,重写equals()后,一个名字对应一个人,不会因为多叫几声,就多了几个名字为zhangsan的人。
//字符串的比较
String hello = "hello"; //字符串常量,检查String pool 中没有"hello"对象,所以创建"hello"对象,返回栈内存地址,并赋值给引用hello。
String hello2 = "hello"; //检查String pool,发现已经有了"hello"对象,则把栈内存地址直接返回,并赋值为字符串的引用hello2.该代码并没有创建新的字符串对象。
System.out.println(hello==hello2); //字符串对象引用的比较 ,因在字符串池中(栈内存),所以输出结果为true
System.out.println(hello.equals(hello2)); //字符串字面值的比较,因为值都是"hello",输出结果也为true;
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
//关于String的相等==问题
String hel = "hel";
String lo = "lo";
String hello0_0 = "hello";
System.out.println(hello0_0 == "hel"+"lo"); //输出true,因为运算是在编译时
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] |
|
|