`

Java_对所有对象都有用的方法

    博客分类:
  • Java
 
阅读更多

via: http://www.cnblogs.com/shipengzhi/archive/2011/07/09/2101785.html

 

覆盖equals时请遵守通用约定

1.什么时候应该覆盖Object.equals呢?

         如果类具有自己特有的“逻辑相等”概念(不同于对象等同的概念),而且超类还没有覆盖equals以实现期望的行为,这时就需要覆盖equals方法。(“值类”,仅仅表示一个值的类,例如:Integer或者Date)

         ==与equals的区别:==比较的是内存中的地址,对象等同;而equals()比较的是地址内的内容,比较的是对象,逻辑相同.

         有一种值类不需要覆盖equals方法,即实例受控确保“每个值之多值存在一个对象”,例如枚举类型,这样的类,逻辑相同与对象等同是一回事。

2.覆盖equals应该遵守的约定:

          1.自反性:x.equals(x)必须返回true;

          2.对称性:当且仅当x.equals(y)返回true时,y.equals(x)必须返回true;

          3.传递性:如果x.equals(y)返回true时,并且y.equals(z)也返回true,那么x.equals(z)必须返回true

          4.一致性:多次调用x.equals(y)会一致的返回true或者false;

          5.对于任何非null的引用值x,x.equals(null)必须返回false。

3.我们无法在扩展可实例化类的同时,既增加新的值组件,同时又保留equals约定,如Point(x,y)--ColorPoint(x,y,color),这怎么办呢?

在equals方法中用getClass测试代替instanceof测试:

     @Override

      public boolean equals(Object o){

           if(o == null || o.getClass() != getClass())

                   return false;

          Point p = (Point) o;

          return p.x == x && p.y == y;

       }

getClass与instanceof的区别:

  getClass()返回的是运行时类型,和编译时声明的类型无关.例如:

  List obj = new ArrayList();
      String objName = obj.getClass().getName();  //返回java.util.ArrayList
  

    而 obj instanceof List 和 obj instanceof ArrayList 都会返回 true 了

4.检查equals是否编写的正确的窍门:

      1.使用==操作符检查”参数是否为这个对象的引用“;

      2.使用instanceof操作符检查”参数是否为正确的类型“,

      3.把参数转换成正确的类型;

      4.域比较顺序可能影响equals方法的性能,应该最先比较最有可能不一致的域,或者开销最低的域;

  5.覆盖equals时总要覆盖hashCode;不要试图让equals方法过于只能;不要讲equals声明中的Object对象替换为其他类型;

5.对于float域,使用Float.compare方法;对于double域,使用Double.compare方法;如果数组中每个元素都很重要,就可以使用Arrays。equals方法

第9条:覆盖equals时总要覆盖hashCode

第10条:始终要覆盖toString

1.当对象被传递给println,printf,字符串连接符(+)以及assert或者被调试器打印出来时,toString方法会被自动调用。

第11条:谨慎地覆盖clone

第12条:考虑实现Comparable接口

1. Comparable接口中唯一的方法compareTo,不但允许进行简单的等同性比较,而且允许执行顺序比较,它与equals方法具有相似的特征,还是个泛型。

2.Arrays.sort()方法采用的是模板方法模式,它的算法包括三个方法,其中一个为CompareTo(),所以如果想修改排序的顺序规则,可以实现Comparable接口,覆盖compareTo()方法;

依赖于比较关系的类包括TreeSet,TreeMap,Collections和Arrays,他们内部包含有搜索和排序算法;

3.如果你正在编写一个值类,它具有非常明显的内在排序关系,比如按字母顺序、按数值顺序或者按照年代顺序,那就应该坚决考虑实现这个接口。

4.compareTo方法,将这个对象与指定对象进行比较时,当对象小于、等于或者大于指定对象时,分别返回-1、0、1.如果由于指定对象的类型而无法与该对象进行比较,则抛出ClassCastException异常;

5.compareTo与equals不一致的地方:BigDecimal类的compareTo方法与equals不一致,如new BigDecimal("1.0")和new BigDecimal("1.00")通过equals方法比较不相等,但通过compareTo方法比较相等;TreeSet和TreeMap的排序采用的compareTo方法比较;HashMap采用equals方法比较;

6.如果一个域并没有实现Comparable接口,或者你需要使用一个非标准的排序关系,就可以使用一个显示的Comparator来代替,或者编写自己的Comparator来代替,或者使用已有的Comparator;

 public class CaseInsensitiveString implements Comparable<CaseInsensitiveString> {

    @Override
    public int compareTo(CaseInsensitiveString cis) {
        return String.CASE_INSENSITIVE_ORDER.compare(s, cis.s);
        return 0;
    }

 

7.比较整数型基本类型的域,可以使用关系操作符<和>,但Double.compare和Float.compare,而不用关系操作符

分享到:
评论

相关推荐

    SE_JAVA_EXP_E046.zip

    例如,他们可能需要创建一个具有属性和方法的对象,并理解如何通过对象来操作数据和执行功能。 异常处理是Java中另一个重要的概念,用于处理程序运行时可能出现的错误。Java提供了try-catch-finally语句块来捕获和...

    MLDN魔乐JAVA_03面向对象(基础).rar

    静态变量是所有对象共享的,而静态方法不与特定对象关联。 9. **final关键字**: final可以用来修饰类、方法和变量,表示不可改变或不可继承。final类不能被继承,final方法不能被重写,final变量一旦赋值就不能...

    JAVA_对象克隆

    这个过程在需要复制对象的所有属性而不创建新类型实例时非常有用。本文将深入探讨Java中的对象克隆,包括其原理、实现方式以及注意事项。 一、对象克隆的原理 在Java中,对象克隆可以通过实现`Cloneable`接口并覆盖...

    JAVA 2面向对象程序设计(习题参考答案1-8).rar_Java 8_java 习题_java 习题_面向对象_面向对象程

    【Java 8 面向对象程序设计】是Java编程中的核心概念,它涉及类、对象、封装、继承、多态等关键知识点。这个压缩包文件包含了一系列的习题参考答案,从章节1到章节8,覆盖了面向对象程序设计的各个方面。 1. **类与...

    java_com.zip_Com.java_Java COM_Java com.gh.Client_java com编程_jav

    总的来说,这个压缩包对学习和实践Java COM编程非常有帮助,它包含了实际的代码示例和可能的教程,可以帮助开发者理解如何在Java中有效地使用和管理COM组件。通过深入研究`www.pudn.com.txt`中的内容和`JCOM`中的源...

    java_CORBA.rar_CORBA java_Java CORBA_corba

    它实现了对象请求代理(ORB)的概念,使得Java对象能够透明地调用其他网络上对象的方法,就像它们在同一个进程中一样。在Java中使用CORBA,可以构建跨越多个操作系统和网络的大型分布式系统。 描述中的"远程方法...

    用JAVA设计面向对象的打印程序.rar_java 打印_java 打印程序_java面向对象_打印 设计

    在Java编程语言中,面向对象的设计是核心特性之一,它允许开发者通过类和对象来组织和处理复杂的数据和逻辑。本教程将深入探讨如何利用Java设计一个面向对象的打印程序,涉及的关键知识点包括类的设计、对象的创建与...

    JAVA_《JAVA面向对象程序设计》实验报告_drawing_

    (3)包括所有的setter和getter方法,其中setter方法要求对形参进行验证,例如长、宽和高都大于0;(4)功能方法包括计算表面积getArea()、计算体积getCubage()、判断是否正方体isCube()、输出该长方体的长宽高...

    JAVA_API1.6文档(中文)

    javax.swing 提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方式都相同。 javax.swing.border 提供围绕 Swing 组件绘制特殊边框的类和接口。 javax.swing.colorchooser 包含供 ...

    Programmation_Orientée_Objet_Java_2020-2021_java_Java_OOP_

    《Java面向对象编程详解》 本课程以"Programmation_Orientée_Objet_Java_2020-2021_java_Java_OOP_"为主题,旨在为初学者和有一定基础的学习者提供全面而深入的Java面向对象编程知识。课程覆盖了从Java语言的基础...

    C_Java_Transfer.zip

    使用`JNIEnv`指针获取到Java对象的引用,然后可以使用`GetFieldID`和`GetObjectField`等函数获取Java对象的字段值,并将它们存储到C结构体中。 4. **反向转换** 同样,可以使用`NewObject`和`SetFieldID`等函数,...

    JAVA_JDBC面向对象分页(初步设计二之oracle)

    在Java中,类是对象的蓝图,包含了数据(字段)和操作这些数据的方法。为了实现分页查询,我们可以创建一个专门的Page类,包含当前页数、每页记录数、总记录数等属性,以及获取和设置这些属性的方法。 接下来,我们...

    java_rmi.rar_RMI java_java.rmi

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许Java对象在不同的网络环境中进行交互,就像它们在同一个进程内一样。RMI是Java在分布式系统领域的核心特性,极大地...

    java_basic.rar_java_javabasic

    1. 类与对象:Java是一种面向对象的语言,它通过类来创建对象,对象是类的实例。类定义了对象的属性(数据成员)和行为(方法)。 2. 数据类型:Java有两大类数据类型,即基本数据类型(如int、float、char等)和...

    MLDN魔乐JAVA_09深入引用、this关键字、对象比较.rar

    总的来说,“MLDN魔乐JAVA_09深入引用、this关键字、对象比较”这门课程将帮助你深化对Java核心特性的理解,使你在实际开发中能够更加灵活和高效地运用这些知识。通过学习,你将能够编写出更加专业、健壮的Java代码...

    解决Java_heap_space问题

    在本文中,我们将详细解释 Java_heap_space 问题的成因、解决方法和相关知识点。 Java_heap_space 问题的成因 Java_heap_space 问题的成因主要是由于 JVM 堆空间不足所致。JVM 在启动时会自动设置堆空间的大小,其...

    demo_java的demo_java_risingcck_DEMO_demojava_

    但我们可以假设"demo"可能是一个包含多个Java源代码文件(.java)的目录,每个文件都代表一个独立的示例,覆盖了Java编程的不同方面,如变量、数据类型、控制结构(如if语句和循环)、类与对象、继承、接口、异常...

Global site tag (gtag.js) - Google Analytics