java equals与“==“

【客户类】

public class Customer {

    private  String name;
    private   int  age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
   public  Customer(){

   }

    public Customer(String name, int age) {
        this.name = name;
        this.age = age;
    }

【测试类】

public class EqualsTest {
    public static void main(String[] args) {

         int  i=10;
        int j =10;
        double  d = 10.0;
        System.out.println(i ==j);
        System.out.println(i==d);
        //  ==   比较的可以不是 相同的类型
        char  c1  = 'A';
        char c2 = 65;
        System.out.println(c1==c2);

     Customer  cust1   = new Customer("tom",21);
        Customer  cust2   = new Customer("tom",21);

        System.out.println(cust1 == cust2); //false  比较的地址值
       // 比的是 两个对象的引用 是不是 指向同一个对象实体
        System.out.println("************************");
}
}

【结果】

  先看 运算符 "==",

1. i ==j 明显true,  2i与d不是相同的类型(也可能自动类型转换了?) true 3.不同的类型可以比 true

4. 比较的是引用数据类型,==  比较的是内存中的地址值。

如果进行比较的两个操作数都是数值类型,即使他们的数据类型不相同,只要他们的值相等,也都将返回true.如果两个操作数都是引用类型,那么只有当两个引用变量的类型具有父子关系时才可以比较,而且这两个引用必须指向同一个对象,才会返回true.也就是说比较的是引用数据类型变量,比较的是两个对象的地址值是否相同。

1.可以在基本数据类型变量和引用数据类型变量中
2.如果比较的是基本数据类型的变量,比较的两个变量保存的数据是否相等(不一定类型要相同)
   如果比较的是引用数据类型变量,比较的是两个对象的地址值是否相同

【注意】不同类型可以比较但是:   除了布尔型,八大基本数据类型应该都可以比

 【代码】  equals

public class EqualsTest {
    public static void main(String[] args) {

       Customer  cust1   = new Customer("tom",21);
        Customer  cust2   = new Customer("tom",21);

        System.out.println(cust1 == cust2); //false  比较的地址值

        // 两个对象的引用 是不是 指向同一个对象实体
        System.out.println("************************");


        String   str1  = new String("atguigu");
        String  str2  = new String("atguigu");

        System.out.println(str1 == str2);
        System.out.println("************************");

      //  System.out.println(cust1.equals(cust1));

        System.out.println(cust1.equals(cust2));  //1
        System.out.println(str1.equals(str2));    // 2

        Date date1  = new Date(324325524523L);
        Date  date2 = new Date(324325524523L);
        System.out.println(date1.equals(date2));  // 3
        
    }
}

【结果】    1  2  3   都为true  ,比较的是实体内容, 但是此时的equals是重写了的,也就是说自己定义了的

equals()方法是Object类的方法,在Object类中的equals()方法体内实际上返回的就是使用==进行比较的结果.但是我们知道所有的类都继承Object,而且Object中的equals()方法没有使用final关键字修饰,那么当我们使用equal()方法进行比较的时候,我们需要关注的就是这个类有没有重写Object中的equals()方法.

【如果没有重写的话】,结果: 

 所以可以发现:

 1.是一个方法,而非运算
 2.只能适用于引用数据类型,

 3.Object类中equals()的定义,
   public  boolean  equals (Object obj){
      return   (this == obj)
   }
 说明:  Object类中定义的equals()和==的作用是相同的,比较的是地址值,

4.像String  Date  File 包装类等都重写了Object类中的equals()方法
,这样的话比较的就不是地址值了,而是比较的两个对象的‘实体内容’是否相等

5.自定义类如何重写equals()的话,也通常比较两个对象的的实体内容,需要对
Object类中的方法equals方法进行重写

【重写equals代码】

     @Override
     //  比较两个对象的实体内容是否相同  即name 和age
    public  boolean  equals(Object obj){   //  obj 对象
        if(this  == obj){   // 如果当前对象和引用地址一样
            return   true;
        }
           // 对象       类型      true 进入判断
        if(obj instanceof  Customer){// 具体作用: 测试左边的对象是否是右边类或者该类的子类创建的实例对象

            Customer  cust  = (Customer) obj; //强制类型转化 Customer实体对象

            //比较两个对象的每个属性是否相同
           //刚讲字符串类型String中被重写了,比较内容,name是String类型,所以比较内容

            return   this.age ==cust.age && this.name.equals(cust.name);

        }
        return   false;
    }

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值