• Java中相等测试


    一:equals与==的区别

    (1)基本数据类型

      byte,short,char,int,long,float,double,boolean

      此类数据类型的比较需要使用==,此时比较的是他们的值,若相等,则返回true,若不同,则返回false;

      注:

      Integer a =1000;

      Integer b=1000;

      if (a==b)....

      此时返回为false,因为Integer表示的不是基本数据类型,而是基本类型Int所对应的类,所以此时==比较的是对象是否指向同一个存储区域。

     (2) 类

      Object类中的equals方法检测的是一个对象是否等于另一个对象,或者判断两个对象是否引用了同一个对象;

      当对两个对象使用==进行比较时,比较的是他们在内存中的存放地址,所以只有同一个new出来的对象的两个对象变量比较时,才会返回true,否则比较的结果即为false。

    public class EqualsTest
    {
       public static void main(String[] args)
       {
          Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
          Employee alice2 = alice1;
          Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
          Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);
    
          System.out.println("alice1 == alice2: " + (alice1 == alice2));
    
          System.out.println("alice1 == alice3: " + (alice1 == alice3));
    
          System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));
    
          System.out.println("alice1.equals(bob): " + alice1.equals(bob));
    
      }
      //代码来自CoreJava

    编译结果是:

    alice1 == alice2: true//alice1和alice2是同一个new出来的两个对象,所以返回true

    alice1 == alice3: false//虽然alice1和alice3的对象中的参数相同,但内存中的存放地址不同,所以使用==判断结果为false

    alice1.equals(alice3): true
    alice1.equals(bob): false

        Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);
        Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
        boss.setBonus(5000);
        System.out.println("carl.equals(boss): " + carl.equals(boss));

    编译结果:

    carl.equals(boss): false

      其中Manager是Employee的子类,因此Manager对象比较,首先调用超类的equals方法,如果检测失败,对象就不可能相等,在此代码中,carl和boss在超类中的域都相等,因此需要比较子类中的实例域,由于boss.setBonus(5000);的存在,因此实例域不同,所以输出false。

    附:CoreJava中推荐的完美equals方法建议:

    1.显式参数命名的otherObject,需要将它转换成另一个叫做other的变量。

    2.检测this与otherObject是否引用同一个对象。

    if(this==otherObject)return ture

    3.检测otherObject是否为空,如果为空,则返回false。这个很有必要。

    4.比较this与otherObject是否属于同一个类,如果equals的语义在每个子类中有所改变,就使用getClass进行检测。

    if(getClass!=otherObject。getClass())return false。如果所有的子类都拥有统一的语义,就使用instanceof检测。

    5.将otherObject转换为相应的类类型变量。

    6.使用==比较基本类型域,使用quals比较对象域。如果所有的域都匹配,就返回true,否则返回false。如果在子类中重新定义了equals,就要在其中包含调用super.equals(other)。
  • 相关阅读:
    0603 学术诚信与道德
    0601 新的冲刺
    0525 Scrum 项目7.0
    0523 Scrum 项目6.0
    0518 Scrum项目5.0
    0512 Scrum 4.0
    0512 操作系统之进程调度
    0511 backlog
    0506 Scrum 项目1.0
    复利计算再升级
  • 原文地址:https://www.cnblogs.com/rockwall/p/4070663.html
Copyright © 2020-2023  润新知