== :既可以比较基本类型,也可以比较引用类型,如果比较八大数据类型主要比较的是值,比较引用类型主要比较的是内存地址值
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万+ 关注 私信 展开阅读全文