标签:object类 ati float oat hashcode class 地址 并且 相等
1、==
==是关系操作符,对于基本类型(byte,short,char,int,long,float,double,boolean),比较的是值是否相等;对于对象,比较的是对象的引用(也即栈内存中的存放地址)是否相等。
2、equals
equals是Object类中的方法,默认比较引用,和==处理对象的结果一样,不适用于基本类型。Object中的equals方法如下:
public boolean equals(Object obj){ return (this==obj); }
如果要用equals来比较对象的内容是否相等,需要覆盖equals方法;其实大多数java类库(String、Integer和Date等)都覆盖实现了自己的equals方法。
正确的equals需满足以下5点:
3、hashCode
hashCode返回对象的散列码,返回值是int类型,对象的散列码是为了更好的支持基于哈希机制的Java集合类,例如 Hashtable, HashMap, HashSet 等。Object中的hashCode方法如下:
public native int hashCode();
关于hashCode方法需要注意以下几点:
为什么equals相等的两个对象,其hashCode返回的值一定相等?
对于集合类HashSet、HashMap等和hash有关的类(以HashSet为例),是通过hash算法来散列对象的。对HashSet而言,存入对象的流程为:根据对象的hash码,经过hash算法,找到对象应该存放的位置,如果该位置为空,则将对象存入该位置;如果该位置不为空,则使用equals()比较该位置的对象和将要入的对象,如果两个相等,则不再插入,如果不相等,根据hash冲突解决算法将对象插入其他位置。
而java规定对于HashSet判断是不是重复对象就是通过equals() 方法来完成,这就需要在两个对象equals()方法相等的时候,hash码一定相等(即hashCode()返回的值相等)。假设两个对象equals()方法相等的时候,hash码不相等,会出现equals()相等的两个对象都插入了HashSet中,这时不允许的。
标签:object类 ati float oat hashcode class 地址 并且 相等
原文地址:http://www.cnblogs.com/aaron-shu/p/7419529.html