一.在java的集合中,判断两个对象是否相等的规则

1.判断两个对象的hashCode是否相等
如果不相等,认为两个对象也不相等,完毕
如果相等,转入2
2.判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等

1.equals

equals()作为方法,实现对象的比较。由于==运算符不允许我们进行覆盖,也就是说它限制了我们的表达。因此我们复写equals()方法,达到比较对象内容是否相同的目的。而这些通过==运算符是做不到的。

2.object类的equals()方法的比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:
java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)
String s1=new String("abc");创建了两个对象,一个是abc,一个是指向"abc"的引用对象s1;
String s2=new String("abc");另开辟空间,也创建了两个对象,一个是abc,一个是指向"abc"的引用对象s2;
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
运行结果为false true

2.为什么要重写equal方法
答案:因为Object的equals方法默认是两个对象的引用的比较,意思就是指向同一内存,地址则相等,否则不相等;如果你现在需要利用对象里面的值来判断是否相等,则重载equal方法。

3.为什么重写hashCode方法
答案:一般的地方不需要重载hashCode,只有当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会重载hashCode,那么为什么要重载hashCode呢?就HashMap来说,好比HashMap就是一个大内存块,里面有很多小内存块,小内存块里面是一系列的对象,可以利用hashCode来查找小内存块hashCode%size(小内存块数量),所以当equal相等时,hashCode必须相等,而且如果是object对象,必须重载hashCode和equal方法。

4.HashMap中为何要同时实现hashCode()与equal两个方法

hashCode是编译器为不同对象产生的不同整数,根据equals方法的定义:如果两个对象是相等(equals)的,那么两个对象调用hashCode必须产生相同的整数结果,即:equals为true,hashCode必须为true,equals为false,hashCode也必须为false,所以必须重写hashCode来保证与equal同步。