zoukankan      html  css  js  c++  java
  • java中的==与equals()

    ==用法

    1.比较基本数据类型,如果两个值相同,则结果为true

    2.比较引用时,如果引用指向内存中的同一对象,结果为true

    equals()用法

      函数原型:public boolean equals(Object obj)

    1.当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false

    既然是两者有同样的作用,为什么还要弄出一个equals()方法来呢。因为==运算符不允许我们进行覆盖,也就是说它限制了我们的表达。

      示例:

     1 /**
     2  * @author xiaoyuer
     3  *
     4  */
     5 public class Students 
     6 {
     7     private int age;
     8     private String name;
     9     
    10     public Students (int age,String name)
    11     {
    12         this.age = age;
    13         this.name = name;
    14     }
    15 
    16     public int getAge() {
    17         return age;
    18     }
    19 
    20     public void setAge(int age) {
    21         this.age = age;
    22     }
    23 
    24     public String getName() {
    25         return name;
    26     }
    27 
    28     public void setName(String name) {
    29         this.name = name;
    30     }    
    31 }
    32 
    33  class EqualTest
    34 {
    35     public static void main(String args[])
    36     {
    37         Students e1 = new Students (18,"张三");
    38         Students  e2 = new Students (18,"张三");
    39         
    40         System.out.println(e1 == e2);
    41         System.out.println(e1.equals(e2));
    42     }
    43 }
    44 equals使用
    equals使用

    运行结果

    false

    false

    结果说明:使用"=="号跟使用equals()方法结果都为false,说明equals()函数的本意为确定两个对象的引用是否相同

    JDK提供了覆盖机制:

    而JDK类中有一些类覆盖了oject类的equals()方法,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:
    java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)

      示例:

     1  class EqualTest
     2 {
     3     public static void main(String args[])
     4     {        
     5         String e1=new String("aaa");
     6         String e2=new String("aaa");
     7 
     8         System.out.println(e1 == e2);
     9         System.out.println(e1.equals(e2));
    10     }
    11 }
    jdk覆盖机制

    运行结果

    false

    true

    结果说明:在String中equals()方法被进行了覆盖,使其意义变为比较两个对象的内容是否一致

    拓展提升:复写equals()方法,实现比较其他内容

    我们还应该注意,Java语言对equals()的要求如下,这些要求是必须遵循的:
    • 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
    • 反射性:x.equals(x)必须返回是“true”。
    • 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
    • 还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
    • 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。
    以上这五点是重写equals()方法时,必须遵守的准则,如果违反会出现意想不到的结果,请大家一定要遵守。

    equals()相等的两个对象,hashcode()一定相等;
    equals()方法不相等的两个对象,hashcode()有可能相等。(可能存在哈希冲突)。

     1 /**
     2  * @author xiaoyuer
     3  *
     4  */
     5 public class Students 
     6 {
     7     private int age;
     8     private String name;
     9     
    10     public Students (int age,String name)
    11     {
    12         this.age = age;
    13         this.name = name;
    14     }
    15     
    16     @Override
    17     public boolean equals(Object obj)
    18     {
    19         //1.判断传入的对象是否与对象obj地址一样
    20         if (this == obj)
    21            return true;
    22         
    23         //2.x.equals(null),永远返回是“false”;
    24         if (obj == null)
    25            return false;
    26         
    27         //1.反射性
    28         if (getClass() != obj.getClass())
    29            return false;
    30         
    31         Students  other = (Students) obj;
    32         
    33         if (name == null) 
    34         {
    35            if (other.name != null)
    36                //name不为空,且不相等,返回false
    37                return false;
    38         }
    39         else if (!name.equals(other.name))
    40             return false;
    41         
    42         //age不想等,返回false
    43         if (age!= other.age)
    44             return false;
    45         
    46         return true;
    47 
    48     }
    49 
    50     //复写了equals()方法后还要复写hashCode()方法, 以保证相同的对象返回相同的hashcode
    51     @Override
    52     public int hashCode()
    53     {
    54         int result = 1;
    55         final int prime = 31;
    56         result = prime * result + ((name == null)?0:name.hashCode());
    57         result = prime * result + age;
    58         return result;
    59     }
    60     
    61     public int getAge() {
    62         return age;
    63     }
    64 
    65     public void setAge(int age) {
    66         this.age = age;
    67     }
    68 
    69     public String getName() {
    70         return name;
    71     }
    72 
    73     public void setName(String name) {
    74         this.name = name;
    75     }    
    76 }
    77 
    78  class EqualTest
    79 {
    80     public static void main(String args[])
    81     {        
    82         Students e1=new Students(18,"张三");
    83         Students e2=new Students(18,"张三");
    84 
    85         System.out.println(e1 == e2);
    86         System.out.println(e1.equals(e2));
    87     }
    88 }
    复写equals

    结果:

    false

    true

  • 相关阅读:
    IntlliJ IDEA 注册码获取或离线破解
    selenium元素定位
    appium元素定位
    django模型之meta使用
    django 之admin使用
    django之models模块使用
    Django的httprequest对象和httpresponse对象
    parameterized之unittest参数化
    HTMLTestRunner不生成报告
    collections之python基本应用
  • 原文地址:https://www.cnblogs.com/baoxiaofei/p/4567371.html
Copyright © 2011-2022 走看看