zoukankan      html  css  js  c++  java
  • java中equals(),hashcode()和==的区别

    一、==

      java中的数据类型,可分为两种:

    • 基本数据类型,也称原始数据类型

      byte,short,int,long,float,double,char,boolean 他们之间的比较,应该用双等号(==),这是比较他们的

    • 引用类型(类、接口、数组)

      当用==对它们进行比较的时候,比较的是它们在内存中的存放地址,所以,除非是同一个new出来的对象,他们比较的结果为true,否则为false;对象是存放在堆中的,栈中存放在是对象的引用(地址)。

      由此可见,==是对栈中的值进行比较。如果要比对堆中的对象是否相同,那就要重写equals方法了。

      如下的情况要注意:

      Integer a1 = 127; 

      Integer b1 = 127;

      Integer a = 128; 

      Integer b = 128; 

      a1==b1,是为true,但a==b是返为false ,为什么呢?

      看一下源码大家都会明白,对于-128到127之间的数,会进行缓存,Integer b1 = 127时,会将127进行缓存,下次再写Integer i6 = 127时,就会直接从缓存中取,就不会new了。

      所以a1==b1:true;a==b:false 

    二、equals()

      1、默认情况(没有覆盖equals方法),equals方法都是调用Object类的equals方法,而Object类的equals方法是判断对象的内存地址引用是不是同一个地址;

      2、如果类覆盖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 

    三、hashcode()

       hashCode()方法返回的就是一个数值,从方法的名称上就可以看出,其目的是生成一个hash码。hash码的主要用途就是在对对象进行散列的时候作为key输入,据此很容易推断出,我们需要每个对象的hash码尽可能不同,这样才能保证散列的存取性能。事实上,Object类提供的默认实现确实保证每个对象的hash码不同(在对象的内存地址基础上经过特定算法返回一个hash码)。

      Java采用了哈希表的原理。哈希(Hash)实际上是个人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。 哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。   

    散列函数,散列算法,哈希函数。

    是一种从任何一种数据中创建小的数字“指纹”的方法。
    散列函数将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。
    好的散列函数在输入域中很少出现散列冲突。

     引用参考

  • 相关阅读:
    FastJson序列化枚举类
    优雅计时StopWatch
    spark算子之aggregateByKey
    scala系列列表
    iOS开发证书不受信任
    .NET Core 中的鉴权授权正确方式
    设置双击直接打开.ipynb文件
    Ubuntu18添加开机启动项
    iOS ObjectC 笔记(二)GCD
    iOS VideoToolBox decoder解码失败(12909和12911)问题解决(二)
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/10438119.html
Copyright © 2011-2022 走看看