java中==与equals()方法的比较

人之所以痛苦,那是因为你在成长。--------magic_guo

“==” 与 equals()方法都是对两个对象进行比较,但是它们的使用方法又不相同,下面来看具体的区别:

/*
* ==:
*   是一个运算符
*   可以使用在基本数据类型中和有引用数据类型中;
*   在基本数据类型中比较的是对象的数据值(不一定要类型相同,但是不能与boolean型作比较)
*   在引用数据类型中比较的是两个对象的地址是否相同、即两个在栈中引用在是否指向堆中同一个对象实体
*
* equals():
*   Object类中的一个方法
*   只适用于引用数据类型
*   Object类中的equals()的比较还是使用的“==”运算符;
*   在Date、String、File、包装类等都重写了equals()方法,重写以后,比较的不再是地址值,而是比较数据值;
*
*
* */

import java.util.Date;

public class EqualTest {
    public static void main(String[] args) {
        int i = 10;
        int j = 10;
        double k = 10.0;
        System.out.println(j == k);//true
        System.out.println(i == j);// true
        char c = 10;
        System.out.println(i == c);// true
        char c1 = 'A';
        char c2 = 65;
        System.out.println(c1 == c2);//true
        Person p1 = new Person(18, "Jane");
        Person p2 = new Person(18, "Jane");

        System.out.println(p1 == p2);//false
        String s = new String("ll");
        String s1 = new String("ll");
        System.out.println(s == s1);// false
        System.out.println("***************************************");
        // equals()
        System.out.println(p1.equals(p2));// false
        /*
        * 为什么别的类使用equals()方法,都返回true,而Person类却返回false
        * 解释:Object是所有类的父类,Person类继承了Object类的equals()方法
        *   Object类中的equals()方法:
        *       public boolean equals(Object obj) {
                    return (this == obj);
                }
            说明在Object类中,使用的也是==运算符来比较两个对象,而==运算符在引用数据类型中,比较的是两个对象的地址值,
            因此返回false;
        * */
        System.out.println(s1.equals(s));// true
        Date d1 = new Date(123456l);
        Date d2 = new Date(123456l);
        System.out.println(d1.equals(d2)); // true
        /*
        * 那为什么使用String、Date类中的equals()方法来比较两个对象,返回的确实true?
        * 解释:
        *   String类中的equals()方法:
        *       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;
            }
          Date类中的equals()方法:
                public boolean equals(Object obj) {
                    return obj instanceof Date && getTime() == ((Date) obj).getTime();
                }
          根据源码分析:虽然这两个类都继承了Object类,但是他们重写了equals()方法,进而来比较的是两个对象的数据值,
          * 因此返回true。
        * */
    }
}

class Person{
    private int age;
    private String name;
    public Person(int age, String name){
        this.name = name;
        this.age = age;
    }
}

结果:
true
true
true
true
false
false
***************************************
false
true
true

不到之处,请多多批评指正!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值