1.Object中的equals方法

java中的的基本数据类型:byte,short,char,int,long,float,double,boolean。==比较的是值。

❶作用:对于复合类型来说,equal判断两个引用变量是否指向同一个对象,即判断地址(等同“==”)。返回true,否则返回false。并没有实际检查是否内容相同。默认实现为:

  1. public boolean equals(Object obj)
  2.       {return (this==obj);}
[java] view
plain
copy

  1. public class Animal{........}
  2. Animal  animal1=new Dog();
  3. Animal  animal2=new  Cat();
  4. Animal  animal3=animal1;
  5. animal1==animal2   (False)
  6. animal1.equals(animal2)  (False)
  7. animal1==animal3   (True)
  8. animal1.equals(animal3)   (True)
  1.     JDK类中有一些类覆盖了Object类的equals()方法。比较规则为:如果两个对象的类型一致且内容一致,则返回true。这些类有:java.io.filejava.util.Datejava.lang.string,包装类(Integer,Double)。
  1.   相反,“==”此时不具备内容比较功能。
[java] view
plain
copy

  1. Integer  int1=new Integer(1);
  2. Integer int2=new Integer(1);
  3. String str1=new String("hello");
  4. String str2=new String("hello");
  5. int1==int2;//false,不同引用对象
  6. int1.equals(int2);//TRUE,相同内容
  7. str1==str2;//False,不同引用对象
  8. str1.equals(str2);//True,相同内容

❸可自定义覆盖object类的equals()方法,重新定义比较规则。

  1.  
  2. 下面Person类的equals()比较规则为:只要两个对象都是Person类,并且他们的属性name都相同,则比较结果为true,否则返回false
[java] view
plain
copy

  1. public class Person{
  2. private String name;
  3. Person(String name)
  4. {this.name=name;}
  5. public boolean equals(Object o){
  6. if (this==null) return true;
  7. else if (!o instanceof Person) return false;
  8. final Person other=(Person)o;
  9. if (this.name().equals(other.name()))
  10. return true;
  11. else
  12. return false;
  13. }
  14. }

注意:在重写equals方法时,要注意满足离散数学上的特性

  1.    ①自反性:对任意引用值Xx.equals(x)的返回值一定为true.
  2.    ②对称性:当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
  3.    ③传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
  4.    ④一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
  5.    ⑤非空性:任何非空的引用值Xx.equals(null)的返回值一定为false
  1.  

2.例子

  1. String s1 = "Monday";
  2. String s2 = "Monday";
  3. s1 == s2;//true
  4. s1.equal(s2);//true
  5.  
  6. String s1 = "Monday";
  7. String s2 =new Sring( "Monday");
  8. s1 == s2;//false
  9. s1.equal(s2);//true
  10.  
  11. String s1 = "Monday";
  12. String s2 = new String("Monday");
  13. s2 = s2.intern();
  14. s1 == s2;//true
  15. s1.equal(s2);//true
  16.  
  17. //程序在运行的时候会创建一个字符串缓冲池。当使用 s2 = "Monday" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序///中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1将s2引用s1所引用的对象"Monday"
  18.  
  19. //第二段程序中,使用了 new 操作符,他明白的告诉程序:"我要一个新的!不要旧的!"于是一个新的"Monday"Sting对象被创建在内存中。他们的值相同,但是位置不同。
  20. //intern()检查字符串池里是否存在某个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会将其添加到字符串池中,然后再返回它的引用。

3.if语句下的错误

  1. public class Test {
  2.     public static void main(String[] args) {
  3.         int x;
  4.         boolean setToTen = false;
  5.         if (setToTen) {
  6.             x = 10;
  7.         }
  8.         if (!setToTen) {
  9.             x = 0;
  10.         }
  11.         System.out.println(x);
  12.     }
  13. }
  14. Java运行报错。此时系统检测不到x初始化,输出报错。尽管我们人为能够看出来。同样的情况出现在两个if下分别return的情况,此时Java也检测不到return语句。应该使用if-else避免这一错误。

Java探索之旅(12)——equals方法及其覆盖的更多相关文章

  1. [java] 更好的书写equals方法-汇率换算器的实现(4)

    [java] 更好的书写equals方法-汇率换算器的实现(4) // */ // ]]>   [java] 更好的书写equals方法-汇率换算器的实现(4) Table of Content ...

  2. 关于java中的hashcode和equals方法原理

    关于java中的hashcode和equals方法原理 1.介绍 java编程思想和很多资料都会对自定义javabean要求必须重写hashcode和equals方法,但并没有清晰给出为何重写此两个方 ...

  3. Java 重写hashCode 方法和equals方法

    package Container; import java.util.HashSet; import java.util.Iterator; /* Set 元素是无序的(存入和取出的顺序不一定一致) ...

  4. K:java中的hashCode和equals方法

      hashCode和equals方法是Object类的相关方法,而所有的类都是直接或间接的继承于Object类而存在的,为此,所有的类中都存在着hashCode和equals.通过翻看Object类 ...

  5. Java:Object类的equals()方法 如何编写一个完美的equals()方法

    一  代码实例: package freewill.objectequals;  /** * @author freewill * @see Core Java page161 * @desc get ...

  6. Java中的“==操作符”和equals方法有什么区别

    Java中的"=="和equals方法究竟有什么区别? 1.==操作符 "=="操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的 ...

  7. Java 基本数据类型 及 == 与 equals 方法的区别

    Java数据类型分为基本数据类型与引用数据类型. 1 基本数据类型 byte:Java中最小的数据类型,在内存中占1个字节(8 bit),取值范围-128~127,默认值0 short:短整型,2个字 ...

  8. 12.equals()方法总结

    超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: 我们知道所有对象都有表示(内存地址)和状态(数据),看上面代码是用"=="来比 ...

  9. Java探索之旅(11)——抽象类与接口

    1.Java数据类型       ❶不可变类,是指当创建了这个类的实例后,就不允许修改它的属性值. 它包括:         Primitive变量:boolean,byte, char, doubl ...

随机推荐

  1. curl使用说明

    默认curl使用get请求,可以使用-d方式指定使用post方式传递数据 https://www.cnblogs.com/gbyukg/p/3326825.html

  2. 图片oom问题

    1.什么是OOM? 程序申请内存过大,虚拟机无法满足我们,然后自杀了.这个现象通常出现在大图片的APP开发,或者需要用到很多图片的时候.通俗来讲就是我们的APP需要申请一块内存来存放图片的时候,系统认 ...

  3. 队列(Queue)

    队列(Queue) Queue: 先入先出(FIFO)的数据结构. offer,add区别: 一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝. 这时新的 offer 方 ...

  4. Python OOP(3) staticmethod和classmethod统计实例

    staticmethod 统计实例 #!python2 #-*- coding:utf-8 -*- class c1: amount_instance=0 def __init__(self): c1 ...

  5. eclipse中,项目无法在tomcat中发布(project facet java version 1.7 is not supported)

    在tomcat中发布项目时无法添加项目,错误信息:project facet java version 1.7 is not supported,如下图 这是由于你的tomcat的jdk版本低于你项目 ...

  6. 改进地图的vo类

    现在的地图只是各帧特征点的集合.创建地图:局部,全局.局部:只相机位置附近的特征点,用来和当前帧匹配求解相机位置的.全局:不定位,回环检测和地图表达.重点或麻烦:维护局部地图的规模.为了实时,保证地图 ...

  7. 算法(Algorithms)第4版 练习 2.3.25

      代码实现: public static void sort(Comparable[] a) { StdRandom.shuffle(a);//eliminate dependence on inp ...

  8. 分享知识-快乐自己:Caused by: org.hibernate.tool.schema.extract.spi.SchemaExtractionException: More than one table found in namespace (, ) : Dept (XXX)

    在命名空间(,)中找到多个表 - SchemaExtractionException? 问题: 尝试在Java应用程序中使用Hibernate将一些值保存到表中时,我一直面临着这个奇怪的异常. 但是, ...

  9. jQuery购物数量数字加减运算效果

    <a href="###" id="add" value="+">+</a> <input type=&quo ...

  10. appium界面元素介绍

    一.主窗口 主页面顶部从左到右依次是: AndroidSettings:android相关的设置 GeneralSettings:全局设置,设置appium相关的内容 DeveloperSetting ...