zoukankan      html  css  js  c++  java
  • javase(==和equals方法的区别和联系)

    1、==

    (1)基本数据类型:比较的是值是否相等

       int a=1;
       int b=1;
       System.out.println(a==b);

    返回true。

    (2)引用数据类型,比较的是是否为同一对象(对应的引用的内存首地址):

            Student student1=new Student("201911","zhai");
            Student student2=new Student("201912","zhang");
            System.out.println(student1==student2);

    返回false。

    两个对象的引用分别指向不同的对象。

    public  static  void main(String [] args){
            Student student3=new Student("201910","tom");
            Student student4;
            student4=student3;
            System.out.println(student3==student4);
        }

    返回true。

    对象的引用虽然不同,但是他们指向的是同一个对象。

    2、equals()方法

    (1)equals()方法不能作用于基本数据类型的变量

    (2)equals()方法作用于引用数据类型,比较的是是否为同一对象:

    equals继承自Object类,查看源码:

       public boolean equals(Object obj) {
            return (this == obj);
        }

    可以看出,其实质是用==比较引用数据类型是否为同一对象。

         Student student3=new Student("201910","tom");
            Student student4;
            student4=student3;
            System.out.println(student3.equals(student4));//true
      Student student3=new Student("201910","tom");
            Student student4=new Student("201911","jack");
            System.out.println(student3.equals(student4));//false

    (3)有些类对equals方法进行了重写(例如:String类):

    查看String类的源码:

    public boolean equals(Object anObject) {
            if (this == anObject) {
                return true;
            }
            if (anObject instanceof String) {
                String anotherString = (String)anObject;
                int n = value.length;
                if (n == anotherString.value.length) {
                    char v1[] = value;
                    char v2[] = anotherString.value;
                    int i = 0;
                    while (n-- != 0) {
                        if (v1[i] != v2[i])
                            return false;
                        i++;
                    }
                    return true;
                }
            }
            return false;
        }

    比较的是对象的值,而不是对象是否为同一对象。

            String string1=new String("jiayou");
            String string2=new String("jiayou");
            System.out.println(string1.equals(string2));//true
            System.out.println(string1==string2);//false

    因为分别创建了两个对象,对象的引用分别指向自己的对象,虽然两个对象的值相等,但是两个对象不是同一个对象(对象的地址不同)。

    (4)自定义equals方法,比较对象的值是否相等:

    public boolean equals(Object obj) {
            // 判断当前对象和传递的对象,如果是同一个对象直接通过
            if (this == obj) {//引用数据类型,比较的是是否为同一对象
                return true;
            }
            // 判断传递进来的对象是否是Vehicle类型,不是的话直接pass
            if (!(obj instanceof Vehicle)) {
                return false;
            }
            // 将obj向下转型为Vehicle引用,可以访问Vehicle特有内容,否则只能访问共有内容
            Vehicle v = (Vehicle) obj;
            return this.vType == v.vType && this.vNum == v.vNum;//基本数据类型,比较的是基本数据类型的值
        }

    对equals方法进行重写后,equals方法的功能由比较两个对象是否为同一对象变为对象的值是否相等。

  • 相关阅读:
    kerberos
    BZOJ 3309 莫比乌斯反演
    Pollard_rho定理 大数的因数个数 这个板子超级快
    POJ 3171 区间覆盖最小值&&线段树优化dp
    拼题 L2-001 紧急救援 最短路计数+记录路径
    HDU 6464 权值线段树 && HDU 6468 思维题
    HDU 1394 线段树求逆序对
    [Poi2010]Bridges 最大流+二分答案 判定混合图欧拉回路
    01背包 多重背包 复习 模板
    CF 2018 Battle of Brains GYM 102062 F
  • 原文地址:https://www.cnblogs.com/zhai1997/p/12398258.html
Copyright © 2011-2022 走看看