Java中的==和equals方法

    在刚接触Java的时候,经常出现用==来判断String是否相等,却判断不出想要的结果,而是只能用equals。当初的懵懵懂懂,后来不断的实践看理论再实践在看理论,终于理解了到底是怎么回事。Java的基础还是要扎实,特别是这种小知识点,虽然很微不足道,但是写代码过程中还是影响挺大滴。

 

==判断

 

    Java中有8种基本数据类型,当使用==来判断基本类型变量(且都是数值类型)是否相等时,只需要两个变量的值相等,==就会返回true。但是当判断两个引用类型变量时,只有当它们指向同一个对象时,==才会返回true。

 

public class Main {
    public static void main(String[] args) {
        int i = 5;
        float f = 5f;
        double d = 5.0;
        System.out.println(i == f);
        System.out.println(i == d);
        System.out.println(f == d);

        String str1 = new String("fiala");
        String str2 = new String("fiala");
        System.out.println(str1 == str2);

        String str3 = "fiala";
        String str4 = "fiala";
        System.out.println(str3 == str4);
    }
}

 

 

    上面的程序执行结果是true   true   true   false   true。对于基本变量比较时,只要他们的值相等,对数据类型没有严格的要求,==都会返回true。但是对于str1和str2,因为它们两个分别是new出来的String引用变量,虽然这两个引用变量指向的对象存储的内容相同,但是==还是认为它们是两个对象,所以会直接返回false。

 

    对于str1-4四个对象,之所以==判断的结果不同,是因为它们在内存中存储不同。str1和str2在编译前是无法确定值的,所以它们会在堆内存中生成两个对象,在栈中会有两个引用指向堆中的两个对象。str3和str4在编译前就确定了值,所以会存入静态数据区,str3和str4都会指向静态数据区同一个字符串对象。

 

equals判断

 

    equals()方法是Object类提供的一个判断是否相等的方法,因此引用变量判断是否相等时可以调用该方法。Object的equals()方法和==的判断规则差不多,即引用变量指向同一个对象时才会返回true,equals方法本身的实现也是==。

 

 

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

 

    

    有的时候判断两个字符串对象是否相等,不需要是相同对象,只需要是存储内容相同就判定为相同,所以String类重写了equals方法,实现了当两个String比较时,即使不是同一个方法,只要存储的字符串相等就返回为true。其实也不止是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;
}

    

 

    通过重写equals方法可以改变判定对象相等的规则,如果equals方法直接返回true,那可能就闹笑话了,因为任何类型都相等,这是不可能的,所以重写equals方法还是要慎重的,根据自己的需要进行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值