黑马程序员技术交流社区

标题: ==和equals的区别 [打印本页]

作者: fyg408224345    时间: 2015-5-20 20:56
标题: ==和equals的区别
学了一段时间,老是不懂==和equals的区别是什么?哪位大神帮帮小弟。谢谢
作者: 姜秋艺    时间: 2015-5-20 21:08
== 比较的是真实地址         equals比较的是内容
作者: 黑马生涯    时间: 2015-5-20 21:08
equals默认比较的是对象是否相等,比较的是地址值。
作者: L番茄X    时间: 2015-5-20 21:28
一个比较对象,一个比较地址值,谢谢.
作者: 郭.威    时间: 2015-5-20 21:30
==比的是地址值,equals比的是对象
作者: andre    时间: 2015-5-20 21:42
==可以比较基本数据类型,也可以比较引用类型,比较基本数据类型比的是值,引用类型比较的是地址值
equals只能比较引用数据类型,默认情况下比的是地址值,如果重写equals的话,可以比较值(就像String类的equals就是被重写的,他比较的就是值)
作者: 谢晓明    时间: 2015-5-20 21:50
==比较的是两个变量的值是否相等,如果是基本数据类型,则直接比较两个值是否相等;如果是引用数据类型,则比较的是两个变量的地址值。即==比较的是在栈中的内容是否一直,而equals方法可以比较两个变量指向堆中的内容是否一样
作者: 李俊超    时间: 2015-6-6 23:58
==和equals的区别?A:"=="是运算符中关系运算符的一种:比较基本数据类型是不是相等,返回类型是boolean类型(true/flase)

B:equals是API 常用类String类中的方法:
            public boolean equals(Object obj)方法:指示其他某个对象是否与此对象“相等”。
            //该方法默认情况下比较地址值;比较地址值一般来说意义不大,所有我们要重写此方法;
                        如何重写呢?
                                public boolean equals(Object obj){
                                        return true;//重写的返回值为ture.
                                        //这里要比较所有的返回值都是true.没有意义需要改进:Studentl类其实要比较name和age;
                                        //但是,name是String类型,而String是引用类型的,所有,在这里不能直接用”==“比较,
                                        应该用equals比较,重写equals方法;
                                        String的equals()方法是重写自Object类的,比较的是字符串的内容是否相同。
                                }       
                           源码:                                 public boolean equals(Object obj){
                                                   return (this==obj);
                                                                s1 ==  s2  //比较引用对象的地址值:
                             }
                           重写后的代码:
                               //hashCode的方法重写:
                                    public int hashCode() {
                                            final int prime = 31;
                                            int result = 1;
                                            result = prime * result + age;
                                            result = prime * result + ((name == null) ? 0 : name.hashCode());
                                            return result;
                                    }
                             //equals()方法的重写(eclipes自动调出):
                                  public boolean equals(Object obj) {
                                               if (this == obj)
                                                         return true;
                                               if (obj == null)
                                                       return false;
                                               if (getClass() != obj.getClass())
                                                       return false;
                                             Student other = (Student) obj;
                                                if (age != other.age)
                                                     return false;
                                               if (name == null) {
                                               if (other.name != null)
                                                   return false;
                                              } else if (!name.equals(other.name))
                                                return false;
                                               return true;
                                          }
                     public calss StudentDemo{
                                   public static void main(String[] args){
                                            Student s1 = new Student("楼主",23);
                                            Student s2 = new Student("楼主" , 23);
                                            Student s3 = s1;

                                            System.out.println(s1==s2);//flase
                                            System.out.println(s1==s3);//ture
                                            System.out.println(s.equals(s2));//没有重写hashCode是: flase;重写hashCode和equals后是ture;
                                   }
                            }

              总结:
                           ”==“比较的是地址对用的哈希值,即对象的hashCode值(基本数据类型)是否相等。
                           ”equals"比较的是重写后对应的String类(应用类型)是否相等(即Student。中的name);





作者: bianzhiguo6    时间: 2015-6-7 00:23
http://bbs.itheima.com/thread-189392-1-1.html
详细解答
作者: xiaodong    时间: 2015-6-7 01:45
==:
               比较基本类型:比较的是基本类型的值是否相同。
               比较引用类型:比较的是引用类型的地址值是否相同。

          equals():
               比较引用类型,默认比较的是引用类型的地址值是否相同。
               如果类重写了该方法,那就得按照重写后的规则进行比较。
作者: 君子无醉    时间: 2015-6-7 02:28
楼主说的这个问题我重点研究过 ==比较的是值是否相等,如果比较的是基本类型,那么就会比较这两个值,比如3==2,返回值是false  如果比较的是引用类型,比如两个学生对象,那么比较的是地址值,这个地址值就是栈内存变量指向堆内存空间的地址值,你可以造一个没有重写toString()方法的对象,用println输出一下对象名来看一下这个地址值。。
作者: 君子无醉    时间: 2015-6-7 02:34
equal()是一个方法,它存在于Object这个类中,又因为这个类是所有类的父类,所以所有对象都可以调用这个方法,而且这个方法的参数接受的也是任意类型对象  这个方法在Object中,代码大致是return this==obj,就是默认返回的结果是比较这两个对象的地址值是否相同,如果你想要让这个方法比较的是对象的内容是否相同(比如一个学生类  比较姓名 年龄等等),那你自己就需要重写,根据你的需求来重写具体要比较什么,然后设置返回值是true还是false。。至于怎么重写,你可以用eclipse自动生成开看一下 或者通过api查看String这个类
作者: 君子无醉    时间: 2015-6-7 02:41
手机能一次发表的字数有限,接着跟你说  你可以通过API查看String这个类,然后看看它里面的equal方法。。这个方法就是重写后的(java工作人员,封装这个类的时候 重写的)  还有一个需要注意的地方,ArrayList集合中的contains这个方法,底层依赖的是equal方法,如果你集合中的对象中 没有重写equal方法,那么比较是否包含的结果永远都会返回fslse。哥们,手机纯打,希望给点分  如果还有不懂的可以加我扣扣  363246266
作者: zhouzhiming88    时间: 2015-6-7 09:20
==可以比较基本数据类型以及引用类型,比较基本数据类型比的是具体数值,引用类型比较的是地址值。 equals只能比较引用数据类型,默认情况下比的是地址值,如果重写equals的话,可以根据需求来比较。
作者: Monster    时间: 2015-6-7 09:29
=  对于在没有在常量池中储存的变量,比较的是内存地址,常量池中储存的变量比较的是内容                 Equals是按类中提供的Equals方法来比较,一般比较的内容   




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