java==和equals的区别

 对于基本类型==和equals一致,封装类型则需要重写hashcode和equals方法,下面以代码为例

           

 

           

/*
* 这种方式会把abc放到常量池中,后面如果再有引用abc则直接从常量池中查询,如果常量池中没有则在常量池中开辟空间存储abc
* */
String a= "abc";
String b=a;
String c="abc";
/*
* 这种方式是直接在堆内存中存储
* */
String d=new String("abc");
String e =d;
User user = new User();
User user1 = user;
User user2 = new User();
System.out.println(a+"\r\n"+b+"\n"+c+"\n"+d);
/*
* ==比较的是对象在堆内存中的地址(不是栈内存中的引用哦),object的equals等同于==,
* String的equals进行了重写,是逐位比较字节,String的本质是用byte数组存储的
*
* */
System.out.println(a==b);
System.out.println(a.equals(b));
System.out.println(a==c);
System.out.println(a.equals(d));
System.out.println(a==d);
System.out.println(e==d);
System.out.println(user1==user);
System.out.println(user1.equals(user));
/*要想new的两个对象equals=true,必须重新equals方法,否则等同于==,lombok很好的帮我们实现了这一点
* */
System.out.println(user.equals(user2));
System.out.println(user);
System.out.println(user1);
/*
* 总结:
* 1.object的==和equals等同,都是比较的object的hashcode,即堆内存地址
* 2.基本类型的==和equals等同,一般使用==
* 3.object的hashcode是个native方法,返回的是堆内存地址
* 4.封装类型如果重写了equals方法,理论上equals和hashcode就没有关系了,
* 但很多框架和技术默认equals返回true时,hashcode一定一致,所以一般重写了
* equals都会重写hashcode,从而保持两者的一致
* 5.如集合set排重会先比较hashcode,再比较equals(出于效果考虑),
* 如果只重写了equals方法就会出现值相等的对象存两遍,而达到不能去重的目的
* 6.set 本质是map的key,如果hashcode的生成有属性参与,并在add进set后,修改了key,则会导致remove失败
*
*
* */

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值