zoukankan      html  css  js  c++  java
  • ==和equals方法的区别是什么?hashCode方法的作用?

    先说==:

    ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量说对应的内存中所存储的数值是否相等.要比较两个基本数据类型或者两个引用变量是够相等,只用==.

    如果一个变量指向的数据是对象类型,那么就涉及了两块内存,对象本身占用一块堆内存,变量也占用一块内存,

    例如:Object obj=newObject(); 

    obj是一个内存,new Object()是另一个内存.此时变量obj所对应的内存中存储的数值占用的那块内存的首地址.

    对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,就要看这两个变量所对应的内存中的数字是否相等,此时用==操作符来进行比较.

    再说equals:

    它用于比较两个独立对象的内容是否相等,就好比对比两个人长相是否相同,他比较的两个对象是独立的.

    例如: String a=new String(“foo”);    String b=new String(“Foo”);

    两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中的一个对象,这是两个不同的对象,他们的首地址是不同的,即,ab中存储的数字是不相同的,所以,表达式a==b返回的是false,而这两个对象同的内容是相等的,所以,要用a.equals(b),返回true.

    字符串的比较基本上是用equals.

    额外的一些细节:

    如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:

    Boolean equals(Object o){return this==o;}

    这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object类继承)就是使用==操作符,也是在比较两个变量指向的对象是否同一个对象,使用equals和==会得到同样的结果.若比较的是独立的对象就总返回false.所以一些情况下,需要覆盖equals方法.

    然后就是关于hashCode方法.

    hashCode和equals都是用来判断2个对象是否相等.但他们区别比较大.

    一般来说,equals这个方法是给用户调用的,如果你想判断2个对象是否相等,你可以重写equals方法,然后在代码中调用哪个,就可以判断他们是否相等了,简单的来讲,equals方法主要是用来判断从表面上看或者从内容上看,2个对象是否相等.如有个学生类,属性只有姓名和性别,我们可以认为只要姓名和性别相等,那么就说着2个对象是相等的.

    Hashcode方法,一般用户不会去调用,比如在hashmap中,由于ket是不可以重复的,他在判断ket是不是重复的时候就使用了hashcode这个方法,而且也用到了equals方法,这里不可以重复是说equals和hashcode只要有一个不等就可以了!所以简单来说,hashcode相当于是一个对象的编码,就好象文件中的md5,他和equals不同就在于他返回的是int型的.比较起来不直观.我们一般在覆盖equals的同时,也要覆盖hashcode,让他们的逻辑一致.如上述例子,如果姓名和性别相等,那么hashcode的方法也要返回姓名和性别的hashcode值,这样从逻辑上,他们就一致了.

    ==是物理上的判断是否相等,就是内存上判断.

  • 相关阅读:
    HDOJ1269 迷宫城堡
    最长公共子序列 nyoj36
    HDU1081 To The Max 求子矩阵最大和
    nyoj20 吝啬的国度
    景观分析工具:arcgis中patch analysis模块
    景观格局动态变化分析方法(基于ArcGIS、Fragstats、ENVI、ERDAS、Patch Analysis for ArcGIS) (20110315 08:07:03)
    从C#到Python —— 谈谈我学习Python一周来的体会
    如何判定多边形是顺时针还是逆时针
    超新星与暗能量的发现--今年诺贝尔物理奖工作的介绍(转)
    怎样把扫描好的身份证打印出实际大小
  • 原文地址:https://www.cnblogs.com/gxpblogs/p/3068063.html
Copyright © 2011-2022 走看看