java ==,hashCode(),equals(),

  1. ==
    ######==对于应用类型来说,如果Object obj1和Object obj2,obj1==obj2返回true证明这两个对象的内存地址相同(注意我说的是内存地址相同,而不是hashCode相同,这点区别我在hashCode中会讲),内存地址相同,当然意味着这两个对象也相同了。对于基本数据类型,==则判定的是两个变量的值是否相同。
public class TestDoubleEqual{
    public static void main(String[] argv){
        //注意这里建立的是两个对象,一个是str,一个是放在常量池中的“hello”
        String str=new String("hello");
        if(str=="hello"){
            System.out.println("str和\"hello\"内存地址相同");
        }
        else{
            System.out.println("str和\"hello\"内存地址不同");
        }
        int a=0;
        int b=0;
        if(a==b){
            System.out.println("a等于b");
        }
        else{
            System.out.println("a不等于b");
        }
    }
}

这里写图片描述
2. hashCode
######hashCode是用来判断两个对象的值(注意我强调的是值)是否相等,因为基本数据类型直接可以体现出值的大小(例如一个int a=1只有四个字节,这四个字节就是用来存1这个值的),因此不需要用hashCode来判断这两个变量的值是否相等。但是对于引用数据类型,我们无法直接比对两个对象的值是否相等(因为对于引用数据类型来说,里面除了保存实际对象的值之外,还保存了一些其他信息)因此我们需要用hashCode相等来表示(我用的是表示,而不是判读,想告诉大家hashCode相等是因为两个对象的值相等)两个对象的值也相等。好了说完hashCode用来干什么了,那什么是hashCode呢,hashCode和对象的地址有关,了解hashCode的人知道,hashCode就是拉链法中数组的下标,关于这个可以参考我的另一篇文章。如果现在大家依然对hashCode有疑惑,不用担心,看完equals()也许你会恍然大悟。

3.equals ()
######equals()方法是用来判断两个引用对象的值是否相等(因为==可以用来判断基本数据类型),那他是如何判断的呢?一下是java源代码
Object

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

我们知道所有类型的最终基类都是Object,因此如果你在类中没有覆盖Object的equals的话,你用的就是Object的equals,Object的equals方法有局限,我们在==中说道,它只能判断两个对象的内存地址是否相等,却无法判断对象的值是否相等。因此为了判断对象的值是否相等,我们都会刻意的覆盖equals()方法。
这是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的一个构造方法:

    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

这也解释了为什么我说hashCode相等是两个对象的值相等的结果了,String为了新建一个值相等的String对象,直接将前一个的hashCode也拷贝了过来,虽然他们是不同的对象。

Double

    public boolean equals(Object obj) {
        return (obj instanceof Double)
               && (doubleToLongBits(((Double)obj).value) ==
                      doubleToLongBits(value));
    }

剩下的就不列举了,下一个是我自定义了一个Hello类,然后修改了它的equals方法。

public class Hello{
    int i=0;
    public boolean equals(Object obj){
        if(this==obj){
            return true;
        }
        if(obj instanceof Hello){
            if(((Hello)obj).i==this.i){
                return true;
            }
        }
        return false;
    }
    public static void main(String[] argv){
        Hello obj1=new Hello();
        Hello obj2=new Hello();
        if(obj1.equals(obj2)){
            System.out.println("对象的值相等");
        }
    }
}

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值