深入理解java中的==、equals、hashcode
2021-03-22 07:25
标签:this https 数据类型 long 调用 内容 基础 images 散列 hashCode()方法返回的int型hash码,hash码的主要用途就是在对对象进行散列的时候作为key输入,我们需要每个对象的hash码对长度取模后尽可能分散均匀,这样才能保证散列的存取性能。 事实上,Object类提供的默认实现确实保证每个对象的hash码不同。(在对象的内存地址基础上经过特定算法返回一个hash码) hashcode在HashMap中的应用: 需要添加新元素时,先调用这个元素的hashCode方法,找到存放元素对应的位置。 如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了 如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存,不相同就散列其它的地址。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了 byte、short、char、int、long、float、double、boolean: 如果数据类型相等,那么直接返回一个代表他们值是否相等的布尔值 如果类型不等,会将类型低的数据类型转换成数据类型高的再进行数值的比较。java基本数值类型的级别从低到高分别为: 其中由低级别转到高级别,是属于自动类型转换;如果需要由高级别向低级别转换需要强制类型转换 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 注意自动装箱拆箱机制即可 1、默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(和==相同)。下面是Object类中equals方法: 定义的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中的==、equals、hashcode 标签:this https 数据类型 long 调用 内容 基础 images 散列 原文地址:https://www.cnblogs.com/lianjingxiang/p/13892342.htmlhashcode
public native int hashCode();
所以在覆写equals函数时,一定要确保equals为真的两个对象,他们的hashcode要相同。
基本数据类型的==
byte,char,short(这三个平级)—>int—>float—>long—>double
引用类型的==
引用类型与数值之间的==
equals
public boolean equals(Object obj) {
return (this == obj);
}
文章标题:深入理解java中的==、equals、hashcode
文章链接:http://soscw.com/essay/67500.html