黑马程序员技术交流社区

标题: Object类中的equals()方法 [打印本页]

作者: 王光保    时间: 2011-7-18 11:34
标题: Object类中的equals()方法
大家知道Object类中equals()方法实际上可以使用的,但是其默认是比较地址的,并不是按照String类中以内容进行比较。不知道其中原理是什么,大家如果知道帮我解释一下。
作者: 匿名    时间: 2011-7-18 12:28
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

API文档查询结果,学习中的疑问通过API可以很好的解决!!!!!!
作者: 匿名    时间: 2011-7-21 19:56
Object类equals方法的源代码:[code=java]public boolean equals(Object obj) {
    return (this == obj);
}[/code]
作者: 覃俊瑞    时间: 2011-7-21 21:21
标题: Object与String的equals()方法的比较
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]
[ 本帖最后由 覃俊瑞 于 2011-07-21  21:30 编辑 ]




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2