标签(空格分隔): Android
在此之前先要了解hashcode()、equals()、compareTo()、toString()
1、首先是两个引用比较时用的:==和!= 这两个符号在比较引用时,比较的是内存地址,这个地址是这两个引用对应的类的hashCode()的值吗???
2、每个类的equals()默认是比较内存地址,而不是比较对象内容。所以自定义的类一般都要重写equals()后,这样调用A.equals(B)后才能比较内容。否则是判断内存地址,
具体例子请看参考博客
当equals()被重写时,通常有必要重写 hashCode 方法,
【因为这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,
当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,
导致混淆,因此,就也需要重写hashcode()】
以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。如下:
(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true
(2)当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false
如int,float等)和String类(因为该类已重写了equals和hashcode方法)对象时,默认比较的是值,
hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。
总结:
自定义类要重写equals方法来进行等值比较,自定义类要重写compareTo方法来进行不同对象大小的比较,重写hashcode方法为了将数据存入HashSet/HashMap/Hashtable类时进行比较.如果有特殊格式的输出,还得覆盖toString()方法,如对象传递给printf等输出函数或者传递给assert断言或者用“+”连接时。
使用AutoValue拯救你的代码###
首先引入依赖库
dependencies {
apt 'com.google.auto.value:auto-value:1.2'
}
然后剩下的步骤请参考博客