==和equal的区别

==

比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。

equal

1.在重写equal方法的时候,一定要重写hashcode方法,因为两个对象相同的话,它们的hashcode值一定相同,反之,不一定相同,

2.equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。

3.在自己写的Javabean中如果要比较对象的值是否相同,就一定要重写equal和hashcode,由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那没就不必在进行equals的比较了,这样就大大减少了equals比较的
次数。

4.String类重写了equal和hashcode。

public class test1 {
    public static void main(String[] args) {
        String a = new String("ab"); // a 为一个引用
        String b = new String("ab"); // b为另一个引用,对象的内容一样
        String aa = "ab"; // 放在常量池中
        String bb = "ab"; // 从常量池中查找
        if (aa == bb) // true
            System.out.println("aa==bb");
        if (a == b) // false,非同一对象
            System.out.println("a==b");
        if (a.equals(b)) // true
            System.out.println("aEQb");
        if (42 == 42.0) { // true
            System.out.println("true");
        }
    }
}

从上面的代码可以看出,String a = new String(“ab”);如果常量池中没有ab这个字符串,如果不存在,则在常量池中开辟一个空间存储,在运行时期,通过String类的构造器在堆内存中new了一个空间,然后将String池中的“ab”复制一份存放到该堆空间中,在栈中开辟名字为str2的空间,存放堆中new出来的这个String对象的地址值。而再一次String b = new String(“ab”);时,又会在对堆内存中创建一块内存,存放ab字符串,a和b指向对象中存放的内容是相同的,但是他们指向的对象的地址值不同。而String aa = “ab”;则是在常量池中创建了一块内存放字符串ab,当 再一次String bb = “ab”;时,引用会去常量池中找是否有ab这个字符串,如果有的话,bb引用就会指向这个字符串,即复制一份值的引用,此时,aa和bb指向的是同一个对象,当bb没有在常量池中找到ab这个字符串时,则会在常量池中创建一块区域存放ab字符串。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值