深入理解java中的==equalshashcode

Posted lianjingxiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解java中的==equalshashcode相关的知识,希望对你有一定的参考价值。

hashcode

hashCode()方法返回的int型hash码,hash码的主要用途就是在对对象进行散列的时候作为key输入,我们需要每个对象的hash码对长度取模后尽可能分散均匀,这样才能保证散列的存取性能。

事实上,Object类提供的默认实现确实保证每个对象的hash码不同。(在对象的内存地址基础上经过特定算法返回一个hash码)

public native int hashCode();

技术图片

hashcode在HashMap中的应用:

需要添加新元素时,先调用这个元素的hashCode方法,找到存放元素对应的位置。 如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了

如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存,不相同就散列其它的地址。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了

所以在覆写equals函数时,一定要确保equals为真的两个对象,他们的hashcode要相同。

基本数据类型的==

byte、short、char、int、long、float、double、boolean: 如果数据类型相等,那么直接返回一个代表他们值是否相等的布尔值

如果类型不等,会将类型低的数据类型转换成数据类型高的再进行数值的比较。java基本数值类型的级别从低到高分别为:

byte,char,short(这三个平级)—>int—>float—>long—>double

其中由低级别转到高级别,是属于自动类型转换;如果需要由高级别向低级别转换需要强制类型转换

java规定:如果对比java类型小的数据做运算,java编译时会强制将他们统一转换成int型,如果高于int,最终数据结果会取其中最高的一个

引用类型的==

对于数组、对象,使用==进行比较的时候,比较的是他们在内存中的存放地址

java中new关键字会在堆中开辟一个新的空间,同一个new出来的对象,他们的地址相同,比较后的结果必为true。不同new出来的对象,返回false

此处注意直接定义的字符串和java包装类有缓存机制,对于字符串,如果定义相同的字符串会直接返回字符串常量池中的对象。

Integer、Byte、Long、Short、Character均有缓存机制,Byte,Short,Long有固定范围:-128到127对于Character,范围是0到127

引用类型与数值之间的==

注意自动装箱拆箱机制即可

equals

1、默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(和==相同)。下面是Object类中equals方法:

public boolean equals(Object obj) {  
    return (this == obj);  
    }  

定义的equals与==是等效的

2 、要是类中覆盖了equals方法,那么就要根据具体的代码来确定equals方法的作用了,覆写后一般目的都是通过对象的内容是否相等来判断对象是否相等。

这里对equals重新需要注意五点:

自反性:对任意引用值X,x.equals(x)的返回值一定为true.

对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;

传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true

一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变

非空性:任何非空的引用值X,x.equals(null)的返回值一定为false

以上是关于深入理解java中的==equalshashcode的主要内容,如果未能解决你的问题,请参考以下文章

Java重写equalshashcode

==equalshashCode区别?

两个对象相等(==equalshashCode)详解

Java基础 -- new对象实体与对象引用方法的返回值构造方法== 与 equalshashCode 与 equals为什么Java只有值传递

深入理解 Java中的 流 (Stream)

深入理解Java中的字段与属性的区别