AutoValue

标签(空格分隔): 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'
}

然后剩下的步骤请参考博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • J2SE 基础 八种基本数据类型的大小,以及他们的封装类。 八种基本数据类型,int ,double ,long ...
    镜中无我阅读 129评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,779评论 18 399
  • 上一篇文章介绍了Set集合的通用知识。Set集合中包含了三个比较重要的实现类:HashSet、TreeSet和En...
    Ruheng阅读 15,710评论 3 57
  • PHPstorm对GBK的支持非常不好,并不能自动识别。但是有时候整个项目是GBK的编码,很麻烦。配置让整个项目默...
    云端漫步的太阳阅读 2,348评论 0 0
  • 思考太多不利行动。 借口太多就拖延不做。 拖延的目的:不敢去面对 隔离,工作不要在规定的期间太快完成 ...
    小转铃66阅读 103评论 0 0