java中 == 、equals()、hashcode()的认识
原文参考:https://www.cnblogs.com/benjieqiang/p/11221751.html、https://blog.****.net/bailu666666/article/details/81153815、https://blog.****.net/qq_38162448/article/details/81611894
一.先来说说Java的基本数据类型和引用类型
八大基本数据类型:Byte,short,int,long,double,folat,boolean,char,其中占一个字节的是byte,short和char占两个字节,int,float占四个字节,double和long占8个字节,boolean只有true和false,这八种数据变量中直接存储值
八大基本数据类型对应着各自的封装类型,提供了更多的方法,且不进行初始化时值默认为空(基本数据类型必须初始化)
像String类型属于引用类型,变量中存储的是地址,对应的地址存储数据
二.equals和==
equals是判断两个变量或者实例指向同一个内存空间的值是不是相同;
而==是判断两个变量或者实例是不是指向同一个内存空间。
【举个通俗的例子来说,==是判断两个人是不是住在同一个地址,而equals是判断同一个地址里住的人是不是同一个】
代码例子:
String str1 = new String("abc");
String str2 = new String("abc");
String str3 = str1;
System.out.println(str1==str2);//false
System.out.println(str1.equals(str2));//true
System.out.println(str1==str3);//true
System.out.println(str1.equals(str3));//true
三、equals()和hashCode()的比较
1.equals()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。
2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
所有对于需要大量并且快速的对比的话如果都用equal()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!