== 和 equals 的区别

通常比较的数据分为:

基本数据类型 :boolean、float、char、byte、short、int、long 、double

(其中boolean 不能参与 == 运算符的比较)

引用数据类型 :类,接口,数组

1、  ==    :

当比较的是基本数据类型时,== 比较的是两个变量的值是否相等;(可以是相同或者不同的数据类型相互比较)

        int a = 5;
        double c = 5.0;
        char i = 5;
        System.out.println(c==a);//输出:true;
        System.out.println(a==i);//输出:true;
   

如果比较的是引用数据类型,== 比较的引用所指向的地址值是否相等。

public class Test {

    public static void main(String[] args) {
        People p1 = new People(16, "小明");  //创建一个对象p1;
        People p2 = new People(16,"小明");  //创建一个对象p2;
        System.out.println(p1==p2); //输出:false
        People p3 = p1;        
         System.out.println(p1==p3); //输出:true
    }
}
class People{ 
     int age;
     String name;

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

第一次比较 p1和p2,虽然两个对象的属性是相同的,但在 new 创建对象时系统会为对象在堆中分配一个地址,而创建的对象就指向这个地址,所以p1,p2是指向两个不同的地址返回false;

第二次比较p1和p3,程序中声明了一个p3,并且将其指向了p1,因为p1是引用数据类型,所以p1和p3指向同一个地址,所以返回true。

2、  equals    :

对于 equals 来说在Object类中其本质也是 ‘ == ’,但一些类对equals语句进行了重写,如String、Date、File、包装类等。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。

String类中对equals方法重写,比较的是内容;

	    String p1 = new String("小明");
        String p2 = new String("小明");
        System.out.println(p1.equals(p2));//true

  People类在定义中没有重写equals,其功能等同于 == 。

	    People p1 = new People(16, "小明");
        People p2 = new People(16,"小明");
        System.out.println(p1.equals(p2));//输出:false;

简而言之,如果类重写equals语句则比较内容,若没有则等同于 == 。

String类对equals重写的源码

 public boolean equals(Object anObject) {
        //判断地址是否相同,相同就返回true
        if (this == anObject) {
            return true;
        }
        //地址不同,判断传进来的参数是否是字符串类型
        if (anObject instanceof String) {
            //强转,才能调用String中特有方法
            String anotherString = (String)anObject;
            //value是字符数组
            int n = value.length;
            //判断长度是否相同,不同直接返回false
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                //不知道需要循环多少次,用while
                while (n-- != 0) {
                    //比较每一个字符,不相等就返回false
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值