zoukankan      html  css  js  c++  java
  • ==和equals

    1)对于==,比较的是值是否相等

                如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

        如果作用于引用类型的变量,则比较的是所指向的对象的地址

      2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象

        如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址; Object中的equals方法返回的却是==的判断。

        诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

    由equals的源码可以看出这里定义的equals与==是等效的(Object类中的equals没什么区别),不同的原因就在于有些类(像String、Integer等类)对equals进行了重写,但是没有对equals进行重写的类(比如我们自己写的类)就只能从Object类中继承equals方法,其equals方法与==就也是等效的,除非我们在此类中重写equals。

      对equals重新需要注意五点:

      1   自反性:对任意引用值X,x.equals(x)的返回值一定为true;
      2   对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
      3   传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true ;
      4   一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变;
      5   非空性:任何非空的引用值X,x.equals(null)的返回值一定为false 。

         

         重写equals一般是要重写hashcode方法的,首先equals与hashcode间的关系是这样的:

         1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;

         2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)   

         比如说两个字符串的hashcode相同,但是这两个字符串可以是不同的字符串,对象也是同理,自己理解的。

        重写了其equals方法,其相等条件是属性相等,就返回true。如果不重写hashcode方法,其返回的依然是两个对象的内存地址值,必然不相等。这就出现了equals方法相等,但是hashcode不相等的情况。这不符合hashcode的规则。下边,会介绍在集合框架中,这种情况会导致的严重问题。

        如果重写(用于需求,比如建立一个Person类,比较相等我只比较其属性身份证相等就可不管其他属性,这时候重写)equals,就得重写hashCode,和其对象相等保持一致。如果不重写,那么调用的Object中的方法一定保持一致。
           1.  重写equals()方法就必须重写hashCode()方法主要是针对HashSet和Map集合类型。集合框架只能存入对象(对象的引用(基本类型数据:自动装箱))。
            在向HashSet集合中存入一个元素时,HashSet会调用该对象(存入对象)的hashCode()方法来得到该对象的hashCode()值,然后根据该hashCode值决定该对象在HashSet中存储的位置。简单的说:HashSet集合判断两个元素相等的标准是:两个对象通过equals()方法比较相等,并且两个对象的HashCode()方法返回值也相等。如果两个元素通过equals()方法比较返回true,但是它们的hashCode()方法返回值不同,HashSet会把它们存储在不同的位置,依然可以添加成功。同样:在Map集合中,例如其子类Hashtable(jdk1.0错误的命名规范),HashMap,存储的数据是<key,value>对,key,value都是对象,被封装在Map.Entry,即:每个集合元素都是Map.Entry对象。在Map集合中,判断key相等标准也是:两个key通过equals()方法比较返回true,两个key的hashCode的值也必须相等。判断valude是否相等equal()相等即可。
          稍微提一句:(1)两个对象,用==比较比较的是地址,需采用equals方法(可根据需求重写)比较。
                                  (2)重写equals()方法就重写hashCode()方法。
                                   (3)一般相等的对象都规定有相同的hashCode。
                                    hash:散列,Map关联数组,字典
         2. 集合类都重写了toString方法。String类重写了equal和hashCode方法,比较的是值。



         至于hashcode有什么用?

         为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那没就不必在进行equals的比较了,这样就大大减少         了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的,一个很好的例子就是在集合中的使用

    原文:https://blog.csdn.net/u013679744/article/details/57074669 

  • 相关阅读:
    Zookeeper安装部署
    dubbo/dubbox部署资料收集
    Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
    ios开发--清理缓存
    从零开始,让你的框架支持CocoaPods
    iOS 开发-- Runtime 1小时入门教程
    iOS 开发--github的demo
    linux 防火墙iptables简明教程
    利用BBRSACryptor实现iOS端的RSA加解密
    iOS开发--数组
  • 原文地址:https://www.cnblogs.com/yonkki/p/10054265.html
Copyright © 2011-2022 走看看