简单概括 ==跟equals的区别

==  

== :既可以比较基本类型,也可以比较引用类型,如果比较八大数据类型主要比较的是值比较引用类型主要比较的是内存地址值

equals(没有被重写过)

equals(父类是object,所以每个对象都会有equals):

  ojbect的 (源代码的149行):出厂默认的话equals等价于 == 

  string 类重写equals:比较的是每一个字符是否相等

hashCode(重写equals就一定要重写hashCode)

    没有重写hashCode值不会变,重写了hashCode值就会改变

    

    

总结:==跟equals的区别

1. ==既可以比较基本类型也可以比较引用类型。

    对于基本类型就是比较值,对于引用类型比较的就是内存地址

2. equals是属于java.lang.Ojbect类里的方法,如果该方法没有被重写过,默认也是==。

    我们可以看到string类的equals方法是被重写过的,而且string类在日常开发中用的比较多,久而久之,就形成了equals是比较值得错误观点。

3. 具体要看这里有没有重写Ojbect的hashCode方法和equals方法来判断。

    如果重写了equals()没有重写hashCode(),这两个实例类有可能是逻辑上相等,但是jvm只看Ojbect.hashCode()方法,所以jvm还是认为这是两个对象,因此违反了“相等的对象必须具有相等的散列码”,所以重写equals方法的时候一般都需要同时重写hashCode方法

4. eclipse工具里的hashCode的重写方法为什么会有31这个数字

    这个涉及到计算机的乘法涉及到移位计算。当一个数乘以2时,就直接拿该数左移一位即可!选择31原因是因为31是一个素数!所谓素数:质数又称素数(在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数)

    在存储数据计算hadh地址的时候,我们希望尽量减少有相同的hadh地址,就是所谓的“冲突”。

    因为任何数 n*31 就可以又被jvm优化为(n<<5)-n,移位和减法的操作效率要比乘法的操作效率高的多,对左移虚拟机里面都有做相关优化,并且31只占用5bits(一个字节占8个位)!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值