public class HashcodeTest {
public static void main(String[] args) {
Integer i1=new Integer(100);
int j = 100;
System.out.println(i1 == j); //true
System.out.println(i1.hashCode());//100
System.out.println(System.identityHashCode(i1));//打印地址
System.out.println(System.identityHashCode(j));
Integer i2=new Integer(128);
System.out.println(i2.hashCode());//128
Integer i3=128;
System.out.println(i3.hashCode());//128
//integer自动拆装箱范围为-128-127,在范围内直接到常量池中取
System.out.println(i2==i3);//false
System.out.println(i2.equals(i3));//true
System.out.println(System.identityHashCode(i2));//打印地址
System.out.println(System.identityHashCode(i3));
}
}
结果:
equals和HashCode的关系
- 1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。
- 2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
所有对于需要大量并且快速的对比的话如果都用equal()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!
equals和==的关系
- equals和==的区别
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。 - equals 比较的话 先比较地址,如果相等,直接返回true 然后看比较的对象是不是类型相同,如果不是直接返回false
如果是的话,则依次比较里面的内容,如果全部相等,则返回true
(这里需要注意string比较,string为引用类型,不是基本类型,用equal和==比较可能不一样)
基本类型与引用类型区别