运用equals来比对对象或者是对象集合的removeAll等是需要重写equals和hashCode,IDEA重写equals和hashCode
1、equals
对于String和Integer等包装类而言,比较的是堆中的值。
对于自定义的普通类,equals比较的是内存的首址,比较两边指向是不是同一个对象。
注意:== 比较的也是内存的首址。
a、如果用==来比较String类型就比较特殊了,对于String="a"这种赋值的,两个相同的值用==比较也是相同的,但是如果是new String()出来的用==比较就不相同了。因为对于赋值的,java会检查堆中是否有相同的值,如果有则新对象和老对象的地址都是该值在堆中的地址;new String()开辟的就是两个栈了,用==比较就不同了。
b、对于包装类,比如Integer,进行自动装箱操作,如果数值在-128~127则会有缓存,==是相同的;如果数值不在那个范围,则不同。
2、用equals比较对象需要重写equals和hashCode
当equals被重写时,通常有必要重写hashCode,以维护hashCode的常规协定(该协定声明相等对象必须具有相等的哈希码)。
hashCode用于散列数据的快速存取,如果用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashCode值来进行判断是否相同。
(1)当Object1.equals(Object2)为true时,Object1.hashCode()==Object2.hashCode()必须为true。
(2)当Object1.hashCode()==Object2.hashCode()为false时,Object1.equals(Object2)必须为false。
如果我们重写了equals,意思就是只要对象的成员变量值都相等,那么equals就为true,但是如果不重写hashCode,那么再new一个新对象Object2,当Object1.equals(Object2)为true时,两者的hashCode却是不一样的,由此会产生理解不一致。
3、对象集合的removeAll等操作(记得重写equals和hashCode)。
(1)创建一个空的List集合:
(2)创建List集合并初始化:
(3)把一个集合全部添加到另一个集合里面:
(4)把a集合包含有b集合的那包含部分删去:
4、IDEA重写equals和hashCode
(1)在实体类那里按 Alt+Insert 两个组合键,然后选 equals() and hashCode()
(2) 然后一路默认下去
到这里就可以用equals来比较对象和对象集合的removeAll等了。