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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fyg408224345 中级黑马   /  2015-5-20 20:56  /  892 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

学了一段时间,老是不懂==和equals的区别是什么?哪位大神帮帮小弟。谢谢

14 个回复

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

          equals():
               比较引用类型,默认比较的是引用类型的地址值是否相同。
               如果类重写了该方法,那就得按照重写后的规则进行比较。
回复 使用道具 举报
回复 使用道具 举报
==和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);




回复 使用道具 举报
==比较的是两个变量的值是否相等,如果是基本数据类型,则直接比较两个值是否相等;如果是引用数据类型,则比较的是两个变量的地址值。即==比较的是在栈中的内容是否一直,而equals方法可以比较两个变量指向堆中的内容是否一样
回复 使用道具 举报
==可以比较基本数据类型,也可以比较引用类型,比较基本数据类型比的是值,引用类型比较的是地址值
equals只能比较引用数据类型,默认情况下比的是地址值,如果重写equals的话,可以比较值(就像String类的equals就是被重写的,他比较的就是值)
回复 使用道具 举报
==比的是地址值,equals比的是对象
回复 使用道具 举报
一个比较对象,一个比较地址值,谢谢.
回复 使用道具 举报
equals默认比较的是对象是否相等,比较的是地址值。
回复 使用道具 举报
== 比较的是真实地址         equals比较的是内容
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马