首先equals()和hashcode()这两个方法都是从object类中继承过来的。
equals()是对两个对象的地址值进行的比较(即比较引用是否相同)。
hashCode()是一个本地方法,它的实现是根据本地机器相关的。
equals():反映的是对象或变量具体的值,即两个对象里面包含的值–可能是对象的引用,也可能是值类型的值。
hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数。根类Object的hashCode()方法的计算依赖于对象实例的D(内存地址),故每个Object对象的hashCode都是唯一的;当然,当对象所对应的类重写了hashCode()方法时,结果就截然不同了。
之所以有hashCode方法,是因为在批量的对象比较中,hashCode要比equals来得快,很多集合都用到了hashCode,比如HashTable。
两个obj,如果equals()相等,hashCode()一定相等。
两个obj,如果hashCode()相等,equals()不一定相等(Hash散列值有冲突的情况,虽然概率很低)。
所以:
可以考虑在集合中,判断两个对象是否相等的规则是:
第一步,如果hashCode()相等,则查看第二步,否则不相等;//加快比较效率
第二步,查看equals()是否相等,如果相等,则两obj相等,否则还是不相等。
hash相等的equals不一定相等,equals相等的hash一定相等
hash和equals重写方法
public class DD {
private String name;
private int age;
public DD(String name, int age) {
super();
this.name = name;
this.age = age;
}
public DD() {
super();
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
DD other = (DD) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
比较DD dd=new DD(“a”,18);
DD dd2=new DD(“B”,19);
hash值都是1616
public class HashCodeEquals {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
DD dd=new DD("a",18);
DD dd2=new DD("B",19);
if(dd.hashCode()>dd2.hashCode()){
System.out.println("a大");
}else if(dd.hashCode()==dd2.hashCode()){
System.out.println("a=b");
}else{
System.out.println("b大");
}
if(dd.equals(dd2)){
System.out.println("a=b");
}else{
System.out.println("a不等b");
}
}
}
equals是对对象内容的比较,不比较地址
String a=new String(“abc”);
String b=new String(“abc”);
boolean c=a==b返回flase
boolean c=a.equals(b);返回ture
compareTo:这个函数的作用就是对两个字符串按字典排序的方式进行比较,返回两个字符串中第一个不同的字符的ascII码差值
String a=new String(“abcd”);
String b=new String(“abc”);
int c=a.compareTo(b);//不同是d和c所以100-99=1
String a=new String(“abcB”);
String b=new String(“abcb”);
int c=a.compareTo(b);//不同是B和b所以66-98=-32