简单概括 ==跟equals的区别

Bertha ·
更新时间:2024-09-20
· 971 次阅读

==  

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

equals(没有被重写过)

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

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

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

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

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

    

    

总结:==跟equals的区别

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

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

2. equals是属于java.long.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个位)!

lxpqxl 原创文章 31获赞 68访问量 1万+ 关注 私信 展开阅读全文
作者:lxpqxl



equals

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章