在java的集合中,判断两个对象是否相等的规则是:
1),判断两个对象的hashCode是否相等
如果不相等,认为两个对象也不相等,完毕
如果相等,转入2)
(这一点只是为了提高存储效率而要求的,其实理论上没有也可以,但如果没有,实际使用时效率会大大降低,所以我们这里将其做为必需的。后面会重点讲到这个问题。)
2),判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键) 作者: 零下五度的水 时间: 2013-11-1 13:06
Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
为了遵循约定,而且这个约定是SUN公司设置的,对于Java程序员来说,这基本等同于神谕,
为什么类名开头要大写呢,为什么方法名开头要小写呢,一个道理嘛作者: 零下五度的水 时间: 2013-11-1 13:11
If two objects are equal according to the equals(Object)
method, then calling the hashCode method on each of
the two objects must produce the same integer result.
其实,equals是用不到Hashcode的,上面这是约定的第二条,
不是说如果两个对象相等就调用hashCode方法比较,
而是说如果两个对象相等,我们约定它们的hashcode必须是相等的作者: 卑微の小幸福 时间: 2013-11-1 21:53
如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等。特别指出利用equals比较八大包装对象
(如int,float等)和String类(因为该类已重写了equals和hashcode方法)对象时,默认比较的是值,在比较其它自定义对象时都是比较的引用地址