==与equals与hashCode(顺便提一下字符串常量池)

1. ==与equals的区别

==通过值来判定是否相等

分两种情况:

        1.基础变量

                如果是基础变量的话就直接判断他们的值是否相等

        2.引用变量

                如果是引用变量则判断他们的引用是否相等

         创建字符串常量时,首先坚持字符串常量池是否存在该字符串,存在该字符串,返回引用实例,不存在,实例化该字符串并放入池中。因此当判断两个通过String a = "a"  这种方式赋值的变量是否相等时会返回true,因为他们有相同的引用。而当String c = new String("a")这样赋值时则在堆空间中开辟了新的地址,判断是否相等为false。我们输出分别输出他们的地址发现a和b是相同的,而c则不同,因此我们判断两个字符串的内容是否相等一般用equals方法。

    public static void main(String[] args) {
        String a = "a";
        String b = "a";
        String c = new String("a");
        System.out.println(a == b);
        System.out.println(a == c);
        System.out.println(System.identityHashCode(a));
        System.out.println(System.identityHashCode(b));
        System.out.println(System.identityHashCode(c));
    }
true
false
460141958
460141958
1163157884

2.equals       

        String类的equals方法是重写的Object类中的equals方法,我们先看Object类中equals的源码,发现其返回的是 == 判断,也是判断引用是否相等。

        1.Object类

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

        2.String类重写equals方法

        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;
    }

3.重写equals必须重写hashCode

        那么为什么重写equals方法必须重写hashCode方法呢,因为这个和hashCode的特点有关,如果两个对象相等,那么他们的hashCode必须相等,但如果hashCode相等,两者不一定相等。

我们重点关注前一句,如果我们重写了equals方法不重写hashCode的话,两个被判断为相等的对象可以拥有不一样的hashCode编码。

        下文是Object类源码中对hashCode的一段注释:

If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值