A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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]


1 个回复

倒序浏览
谢谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马