深入理解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基础 -- new对象实体与对象引用方法的返回值构造方法== 与 equalshashCode 与 equals为什么Java只有值传递