尽管Object是一个具体的类,但设计它主要是为了扩展.它的所有非final方法都有明确的通用约定.任何一个类在override时,必须遵守这些通用约定. 一.覆盖equals时请遵守通用的约定 1.Object中默认的equals方法约定是:类的每个实例都只与它自身相等.当类有自己特有的“逻辑相等”的概念时,就应该覆盖equals方法. 2.Timestamp对Date进行了扩展,Timestamp的equals实现确实违反了对称性.如果Timestamp和Date混合一起使用,可能导致不正确…
Chapter 3 Methods Common to All Objects Item 8: Obey the general contract when overriding equals 以下几种情况不需要你override这个类的equals方法:这个类的每一个实例天生就是unique的,比如Thread:这个类的父类已经override了equals,并已经足够:这是个private或者package的class,你确定equals永远不会被调用,保险起见这时候你其实可以overrid…
第8条:覆盖equals时请遵守通用约定 覆盖equals方法看起来似乎很简单,但是有许多覆盖方式会导致错误,并且后果非常严重.最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下,类的每个实例都只与它自身相等. 那么,什么时候应该覆盖Object.equals呢?如果类具有自己特有的"逻辑相等"概念(不同于对象等同的概念),而且超类还没有覆盖equals以实现期望的行为,这时我们就需要覆盖 equals方法.这通常属于"值类(value class)"…
第10条:覆盖equals时,请遵守通用约定 1.使用==来比较两个对象的时候,比较的是两个对象在内存中的地址是否相同(两个引用指向的是否为同一个对象):Object中定义的equals方法也是这样比较的: 2.当我们自定义类的时候,如果不覆盖equals方法,那么就会使用默认的equals方法(Object中已经定义了),这样的话,只有当对象与对象自身比较才会返回true(指定同一个对象): // Object中的equals,只有对象与对象自身比较才会返回true public boolea…
对于所有对象都通用的方法,即Object类的所有非final方法(equals.hashCode.toString.clone和finalize)都有明确的通用约定,都是为了要被改写(override)而设计的. 七.在改写equals的时候请遵循约定 一个类的每个实例实质上都是唯一的.对于代表了实体活动实体而不是值(value)的类,确实是这样的,比如Thread.Object所提供equals实现对于这些类是正确的. 不关心一个类是否提供了“逻辑相等(logical equality)”的测…
前言: 读这本书第1条规则的时候就感觉到这是一本非常好的书.可以把我们的Java功底提升一个档次,我还是比較推荐的.这里我主要就关于覆盖equals.hashCode和toString方法来做一个笔记总结.希望可以与君共勉. 概述: 这一章主要是说明一些对于全部对象都通用的方法.我们知道Java的多态是其特色之中的一个,而多态的体现方式中就有一种方式叫做"重写".这些概念性的东西我想在大学我们学习Java的初期.老师就会如数家珍一样地灌输给我们.只是.在那个时候有多少人真的了解了什么是…
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4255581.html 第三章      对所有对象都通用的方法 8.            覆盖equals时请遵守通用约定 如果类具有自己特定的"逻辑相等"概念(不同于对象等同概念)…
这一章主要讲解Object类中的方法, Object类是所有类的父类,所以它的方法也称得上是所有对象都通用的方法 第八条 覆盖equals时需要遵守的约定 Object中的equals实现,就是直接对对象进行相等的比较: public boolean equals(Object obj) { return (this == obj); } 那么什么时候需要覆盖equals呢? 当你的类有自己的逻辑相等,而不是对象相等时,应该自己实现equals,比如Date和Interger,他们的相等比较不仅…
第8条:覆盖equals时请遵守通用的约定 设计Object类的目的就是用来覆盖的,它全部的非final方法都是用来被覆盖的(equals.hashcode.clone.finalize)都有通用约定. 首先看看equals方法: 若满足以下的这些情况中的某一个,您能够直接使用Object类中的equals方法而不用覆盖: 类的每个实例本质上是唯一的.对于那些代表实例而不是值的类来说能够不用覆盖equals方法.比方Thread类.由于每个Thread类的实例都表示一个线程,这与Thread某些…
第 10 条:覆盖equals时请遵守通用约定 在不覆盖equals方法下,类的每个实例都只与它自身相等. 类的每个实例本质上都是唯一的. 类不需要提供一个”逻辑相等(logical equality)”的测试功能. 父类已经重写了 equals 方法,并且父类的行为完全适合于该子类. 类是私有的或包级私有的,并且可以确定它的 equals 方法永远不会被调用. 什么时候需要覆盖equals方法?  如果一个类包含一个逻辑相等( logical equality)的概念——此概念有别于对象同一性…
进程与线程 1.  进程 进程和代码之间的关系就像音乐和乐谱之间的关系一样,演奏结束的时候音乐就不存在了但乐谱还在:程序执行结束的时候进程就消失了但代码还在,而计算机就是代码的演奏家. 2. 线程 线程可以比喻成演奏过程中的某一种乐器的声音,乐器声音的种类可以很少,但是不能一个都没有——一个进程至少包含一个线程.线程是程序执行的核心,就像没有了具体乐器的声音就没有了音乐一样. 创建线程的三种方式 1. 继承Thread方法 1). 定义线程类 继承Thread方法时,需要重写Thread的run…
第八条 在改写equals的时候请遵守通用约定 一般以下几种情况,不适宜覆盖equals方法 1.类的每个实例本质上都是唯一的,对于代表活动实体而不是值的类确实如此,例如Thread. 2.不关心类是否提供了"逻辑相等"的测试功能 3.超类已经覆盖了equals,从超类继承过来的行为对子类也是合适的 4.类是私有的或者包级私有的,可以确定它的equals方法永远不会被调用. 那什么情况应该覆盖Object.equals呢?如果类具有自己特有的"逻辑相等"的概念(不同…
一.覆盖equals时请遵守通用约定 1.满足下列任何一个条件时,不需要覆盖equals方法 a.类的每个实例本质上都是唯一的.此时就是Object中equals方法所表达的含义. b.不关心类是否提供了“逻辑相等”的测试功能 c.超类中覆盖的equals方法,使用于子类,不需要自己再覆盖了. d.类是私有或者包级私有,并确定equals方法永远不会被调用,可以不覆盖.或者覆盖equals方法,内容为抛出异常. 2.高质量equals方法的诀窍: a.使用==操作符检测“参数是否为这个对象的引用…
第八条:覆盖equals时请遵守通用约定 什么时候需要覆盖equals方法?类具有自己的逻辑相等概念,并且父类的equals方法不能满足需要.重写equals时需要遵循一下约定: 自反性:非null x,x.equals(x)必须是true 对称性:非null x和y,y.equals(x)和x.equals(y)的结果必须一致 传递性:非null x.y.z,如果x.equals(y)和x.equals(z)的结果为true,那么y.equals(z)也必须为true 一致性:非null x.…
第十条 始终覆盖toString() toString的实现可以使类使用起来更加舒适,在执行println等方法时打印出定制信息. 一单实现了自己的toString,指定输出的固定格式,在方法的文档说明中应该做好注释说明! 第十一条 谨慎覆盖clone 跳过,clone方法需要实现Cloneable, 功能上实现对象的复制而不是引用传递 第十二条 考虑实现Comparable接口 和equlas很类似…
1.覆盖equals请遵守通用规定.不需要覆写equals的场景:a.类的每个实例都是唯一的.b.类不需要提供"逻辑相等"的测试功能.c.超类已经覆盖了equals的方法.d.类是私有,or包私有,保证equals方法用不被调用.覆写场景:有独特的"逻辑相等".实现要求:a.自反,对称,传递,一致(多次比较得一样),对于任何非null值和null比较必须返回false.一致:不要使equals依赖不可靠的资源.(比如java.net.URL的equals依赖于URL…
本节主要涉及Object中通用的一些方法,比如equals,hashCode,toString,clone,finalize等等 覆盖equals时请遵守通用约定 equals方法实现的等价关系: 自反性:对于所有的非null,a=a 对称性:a=b,则b=a 传递性:a=b,b=c,则a=c 一致性:对于没有被修改的ab,如果a=b,则一直a=b 非空性:对于任何非Null,a!=null 高质量equals方法的诀窍: 使用==操作符检查--"参数是否为这个对象的引用" 使用ins…
第10条:始终要覆盖toString 这一条没什么好讲的,就是说默认的toString方法打印出来的是类名+@+十六进制哈希码的值.我们应该覆盖它,使它能够展示出一些更为详细清晰的信息,这个看实际情况吧. 第11条:谨慎地覆盖clone 有时候会出现这样的场景,你需要备份一些数据,对其一进行修改时,另外一个不受影响.这样,直接Foo a = new Foo(); Foo b = a; 是不可行的,b引用和a指向的是同一个对象. 这一条讲了很多,最后的总结是,Cloneable接口坑很多,因此最好…
覆盖equb时请遵循通用约定: 自反性.对于任何非null的引用值x,xequals(x)必须返回true. 对称性.对于任何非null的引用值x和y,当且晋档y.equals(x)返回true的时候,x.equals(y)必须返回true. 传递性.对于任何非null的引用值x,y和z,如果x.equals(y),并且y.equals(z),则x.equals(z)为true. 一致性.对于非null的引用值x和y,只要equals的比较操作在对象所用的信息没有被修改,多次调用x.equals…
第8条: 覆盖equals时请遵守通用约定 我们在覆盖equals方法时,必须遵守它的通用约定: 1.自反性.对于任何非null的引用值x,x.equals(x)必须返回true: 2.对称性.对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true: 一个“不区分大小写”字符串的例子: public class CaseInsensitiveString { private final String s; public CaseIn…
第8条:覆盖equals时请遵守通用约定 ①约定的内容 自反性.对于任何非null的引用值x.x.equals(x)必须返回true. 对称性.对于任何非null的引用值x和y.当且仅当y.equals(x)返回true时,x.equals(y)必须返回true. 传递性.对于任何非null的引用值x.y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,则x.equals(z)也必须是true. 一致性.对于任何非null的引用值x和y,只要equals的比…
第12条:考虑实现Comparable接口 这一条非常简单.就是说,如果类实现了Comparable接口,覆盖comparaTo方法. 就可以使用Arrays.sort(a)对数组a进行排序. 它与equals方法有点类似,但是,因为Comparable接口是参数化的,而且comparable方法时静态的类型,因此不必进行类型检查,也不需要对它的参数进行类型转换.返回负值代表小,正值代表大,0代表相等.…
参考资料:慕课网:Java高效编程收费实战课程.博客园.CSDN.菜鸟教程以及其他文档. 篇幅受限,不太想针对每个点都写篇博客,有的地方可能写的不是很详细,一笔带过了.如果你觉得那个点在项目中用得上可以另行搜索一些相关的更详细的博客或文档. 1.Lambda和函数式编程 函数式编程即可以把函数当作变量.参数.返回值传递.实现的方法就是定义一个函数式接口,函数式接口即只有一个抽象方法的接口.这个接口类型的变量就可以当作参数传递,而在传递的时候可以通过匿名内部类把要执行的逻辑代码传递进去. 函数式接…
[Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Java 和其他平台相比最大的优势在于它可以很好的利用资源来进行并行计算.确实,在 JVM 上可以轻而易举地在后台执行一段代码,并在需要使用它的时候消费计算的结果.同时,它也让开发者可以更好的利用现代计算机硬件所带来计算能力. 但是,想让计算正确并不容易,或许对于开发者最大的挑战是编写一个总是能运行正确的…
Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种.ReentranckLock就是其中的多个分类. 本文主要内容:重入锁理解;重入锁代码演示; ReentranckLock的总结 本篇是<凯哥(凯哥Java:kagejava)并发编程学习>系列之<Lock系列>教程的第四篇:<Java并发包下锁学习第六篇:ReentranckLock的总结>. 我们先来看看内部结构: ReentranckLoc…
教程介绍 所谓"武以快为尊,天下武功唯快不破".本课程剑指Java高效编程,致力于从"技术"和"工具"两大 维度提高编程效率,帮助广大程序员或者未来的程序员逃离"996的魔咒",塑造"代码洁癖"的编程风格.主要包含:链式编程.流式编程.资源关闭.Google开源高效神器Guava.为自己锻造高效IDE神器等,最大化提升工作效率,创造更多价值,契合企业刚需. 学习地址 百度:https://pan.baidu…
1. [array valueForKey:@"title"]; //Returns an array containing the results of invoking valueForKey: using key on each of the array's objects. 使数组中的每个对象都调用valueForKey:方法,并且将每个对象调用方法的结果依次存入一个新的数组中,然后返回 2. [self  setValuesForKeysWithDictionary:dict…
本文主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题.阅读本文应该着重掌握如下技术点: synchronized对象监视器为Object时的使用. synchronized对象监视器为Class时的使用. 非线程安全是如何出现的. 关键字volatile的主要作用. 关键字volatile与synchronized的区别及使用情况. 1.synchronized同步方法 "非线程安全"其实会在多个线程对同一个对象…
一.不变性 满足同步需求的还有一种方法是使用不可变对象(Immutable Object). 到眼下为止,我们介绍了很多与原子性和可见性相关的问题,比如得到失效数据.丢失更新操作或光查到某个对象处于不一致的状态等等,都与多线程视图同一时候訪问同一个可变的状态相关.假设对象的状态不会改变,那么这些问题与复杂性也就自然消失了. 假设某个对象在被创建后其状态就不能被改动,那么这个对象就被成为不可变对象.线程安全型是不可变对象的固有属性之中的一个,他们的不变性条件是由构造函数创建的,仅仅要他们的状态不改…
一.synchronized同步方法 1.方法内的变量为线程安全 “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得结果也就是“线程安全”的了. 示例:由于HasSelfPrivateNum类中的addI(String username)方法的num变量是方法内部的变量,而方法内部的变量是私有的,所以两个线程在分开调用时不会出现非线程安全问题. package service; public class HasSelfPrivateNum { pu…